/ Hex Artifact Content
Login

Artifact 3fd19c98c5223d411b883502d1ac928ddb762a1ea8f031d910210316545fc67c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1000: 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1010: 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53  e->db,TK_ASTERIS
1020: 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  K,0));.  }.  pNe
1030: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  w->pEList = pELi
1040: 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  st;.  pNew->op =
1050: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e   TK_SELECT;.  pN
1060: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73  ew->selFlags = s
1070: 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  elFlags;.  pNew-
1080: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
1090: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
10a0: 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
10b0: 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77  E_ENABLED.  pNew
10c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20  ->zSelName[0] = 
10d0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65 77  0;.#endif.  pNew
10e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
10f0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1100: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
1110: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
1120: 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
1130: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1140: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1150: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
1160: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72  >db, sizeof(*pSr
1170: 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  c));.  pNew->pSr
1180: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
1190: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
11a0: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
11b0: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
11c0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
11d0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
11e0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
11f0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
1200: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1210: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
1220: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1230: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
1240: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1250: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  t;.  pNew->pWith
1260: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1270: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
1280: 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  imit!=0 || pPars
1290: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 50 61  e->nErr>0 || pPa
12a0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12b0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
12c0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
12e0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
12f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1300: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29   pNew!=&standin)
1310: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1330: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
1340: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
1350: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
1360: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
1370: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
1380: 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45   pNew;.}..#if SE
1390: 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
13a0: 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  D./*.** Set the 
13b0: 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74  name of a Select
13c0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
13d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
13e0: 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20  Name(Select *p, 
13f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1400: 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a  e){.  if( p && z
1410: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1420: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1430: 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  eof(p->zSelName)
1440: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22  , p->zSelName, "
1450: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
1460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1470: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
1480: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
1490: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
14a0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
14b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
14d0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
14e0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
14f0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
1500: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
1510: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1520: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
1530: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1540: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
1550: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1560: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1570: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1580: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1590: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
15a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
15b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
15c0: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
15d0: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
15e0: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
15f0: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
1600: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
1610: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
1620: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
1630: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
1640: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1660: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1670: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1680: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1690: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
16a0: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
16b0: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
16c0: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
16d0: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
16e0: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
16f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
1700: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
1710: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
1720: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
1730: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
1740: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
1750: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1760: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1770: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1780: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1790: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17a0: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
17b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
17c0: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
17d0: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
17e0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
17f0: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
1800: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1830: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
1840: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1850: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1860: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1870: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1880: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1890: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
18a0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
18b0: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
18c0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
18d0: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
18e0: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
18f0: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
1900: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
1910: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
1920: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
1930: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
1940: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
1950: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1960: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1970: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1980: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
19a0: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
19b0: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
19c0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
19e0: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
19f0: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a10: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
1a20: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
1a30: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
1a50: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1a60: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1a70: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1a80: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1a90: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1ac0: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1ae0: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1af0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
1b00: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
1b10: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
1b20: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
1b30: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
1b40: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1b50: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1b60: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1b70: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1b80: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1b90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1ba0: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1bb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1bc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1bd0: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1be0: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1bf0: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1c10: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1c20: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c40: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1c50: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1c60: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1c70: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1c80: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1c90: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1ca0: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1cb0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1cc0: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ce0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1cf0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1d00: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1d10: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1d20: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1d30: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1d40: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1d50: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1d60: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1d70: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1d80: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1d90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1db0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1dc0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1dd0: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1de0: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1df0: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1e00: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1e10: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1e20: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1e30: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1e40: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1e50: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1e60: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1e90: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1ea0: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1eb0: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1ec0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1ed0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1ee0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1ef0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1f00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f10: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1f20: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1f30: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1f40: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1f50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1f60: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1f80: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1f90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fa0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1fc0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fe0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1ff0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
2000: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
2010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2030: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
2040: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
2050: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
2060: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
2070: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
2080: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
2090: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
20a0: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
20b0: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
20c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
20d0: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
20e0: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
20f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
2100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
2110: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
2120: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
2130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
2140: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2150: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2160: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2170: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2180: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2190: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
21a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
21b0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
21c0: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
21e0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
21f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
2200: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2210: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2230: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2240: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
2250: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2260: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2270: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2280: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2290: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
22a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22c0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22d0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
22e0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
22f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2300: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
2310: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
2320: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
2330: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
2340: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
2350: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2360: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2370: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2380: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2390: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
23a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
23b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
23c0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
23d0: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
23e0: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
23f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2400: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2430: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2440: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
2450: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2460: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2470: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2480: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2490: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
24a0: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
24b0: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
24c0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
24d0: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
24e0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
24f0: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
2500: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
2510: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
2520: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
2530: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
2540: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
2550: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2560: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2570: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2580: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2590: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
25a0: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
25b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
25c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
25d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2600: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2610: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2630: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
2640: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2650: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2680: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2690: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
26a0: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
26d0: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2710: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
2720: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2730: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
2740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2750: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2760: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2770: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2780: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
27b0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
27c0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27e0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
27f0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
2800: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2820: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
2830: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
2840: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
2850: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2890: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
28a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
28b0: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
28c0: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
28d0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28e0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28f0: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
2900: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
2910: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2920: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
2930: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
2940: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
2950: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2960: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a  _EQ, pE1, pE2);.
2970: 20 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f    if( pEq && isO
2980: 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  uterJoin ){.    
2990: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
29a0: 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  pEq, EP_FromJoin
29b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
29c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29d0: 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  pEq, EP_TokenOnl
29e0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
29f0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2a20: 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  Eq->iRightJoinTa
2a30: 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e  ble = (i16)pE2->
2a40: 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  iTable;.  }.  *p
2a50: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2a60: 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57  ExprAnd(db, *ppW
2a70: 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f  here, pEq);.}../
2a80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
2a90: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2aa0: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
2ab0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2ac0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
2ad0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
2ae0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
2af0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
2b00: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
2b10: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2b20: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
2b30: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
2b40: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
2b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
2b60: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
2b70: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
2b80: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
2b90: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
2ba0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2bb0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2bc0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2bd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2be0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2bf0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2c00: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2c10: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
2c20: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
2c30: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
2c40: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
2c50: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
2c60: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
2c70: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
2c80: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
2c90: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2ca0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
2cb0: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
2cc0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
2cd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2ce0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2cf0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2d00: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
2d10: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
2d20: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
2d30: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
2d40: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
2d50: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
2d60: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
2d70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
2d80: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
2d90: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
2da0: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
2db0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
2dc0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
2dd0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
2de0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
2df0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
2e00: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e10: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
2e20: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
2e30: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
2e40: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
2e50: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
2e60: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
2e70: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
2e80: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
2e90: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
2ea0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2eb0: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2ec0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2ed0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2ee0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2ef0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2f00: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2f10: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2f20: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2f30: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
2f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2f50: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
2f60: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
2f70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
2f80: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2f90: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
2fa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2fb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2fc0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
2fd0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2fe0: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2ff0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
3000: 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52  duce);.    p->iR
3010: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
3020: 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20  (i16)iTable;.   
3030: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3040: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3050: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3060: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3070: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3080: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3090: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45          setJoinE
30a0: 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  xpr(p->x.pList->
30b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
30c0: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
30d0: 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78   }.    setJoinEx
30e0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
30f0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
3100: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3110: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3120: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3130: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3140: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3160: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3170: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3180: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3190: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
31a0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
31b0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
31c0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
31d0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
31e0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
31f0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
3200: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3210: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3220: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3230: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3240: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3250: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3260: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3270: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3280: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3290: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
32a0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
32b0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
32c0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
32d0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
32e0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
32f0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
3300: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3310: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3320: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3330: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3340: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3350: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3360: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3370: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3380: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
33a0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
33b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
33d0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
33e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
33f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3420: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3430: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3460: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3470: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3480: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3490: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
34a0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
34b0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34c0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
34d0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
34e0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
34f0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3500: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3510: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3520: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3530: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3540: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3550: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3560: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
3570: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
3580: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3590: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
35a0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
35b0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
35c0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
35d0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
35e0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
35f0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3600: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3610: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3620: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3630: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3640: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3650: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3660: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3670: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3680: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3690: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
36a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36b0: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
36c0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
36d0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
36e0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
36f0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3720: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3730: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3740: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3750: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3760: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3780: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3790: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
37a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
37b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
37c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
37d0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
37e0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37f0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3800: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3810: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3820: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3830: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3840: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3850: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3860: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3870: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3880: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3890: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
38a0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
38b0: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
38c0: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
38d0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
38e0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
38f0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3900: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3930: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3950: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3960: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3970: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3980: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3990: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
39a0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
39b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
39c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
39d0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
39e0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
39f0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3a00: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3a10: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3a20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
3a40: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
3a50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3a60: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
3a70: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
3a80: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
3a90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
3aa0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
3ab0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
3ac0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
3ad0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
3ae0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
3af0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
3b00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
3b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3b20: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
3b30: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
3b40: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
3b50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3b60: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
3b70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b80: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3b90: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
3ba0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3bb0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
3bc0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3bd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
3be0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
3bf0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
3c00: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
3c10: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
3c20: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
3c30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3c40: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
3c50: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
3c60: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
3c70: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
3c80: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
3c90: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
3ca0: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
3cb0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
3cc0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
3cd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
3ce0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3cf0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3d00: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
3d10: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
3d20: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
3d30: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
3d40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
3d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3d70: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
3d80: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
3d90: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3da0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
3db0: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
3dc0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
3dd0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
3de0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
3df0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e00: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e10: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
3e20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e30: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
3e40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3e50: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3e60: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
3e70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3e80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
3ea0: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
3eb0: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
3ec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
3ed0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
3ee0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
3ef0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3f00: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3f10: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3f20: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
3f30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3f40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f50: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
3f60: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
3f70: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
3f80: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
3f90: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
3fa0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fd0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3fe0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3ff0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
4000: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4030: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4050: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
4060: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
4070: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
4080: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
4090: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
40a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
40b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
40c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
40d0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
40e0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
40f0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
4100: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
4110: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
4120: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
4130: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
4140: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
4150: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
4160: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
4170: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
4180: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a  o the end */.);.
4190: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
41a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70  code that will p
41b0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69  ush the record i
41c0: 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44  n registers regD
41d0: 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72  ata.** through r
41e0: 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f  egData+nData-1 o
41f0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
4200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4210: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
4220: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4230: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4240: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4250: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4270: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f  tion about the O
4280: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
4290: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
42a0: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
42b0: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
42c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
42d0: 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20  t regData,      
42e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
42f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4300: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
4310: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
4320: 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20  gData,       /* 
4330: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4340: 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f  olding data befo
4350: 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20  re packing */.  
4360: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
4370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4380: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
4390: 74 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a  the data array *
43a0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
43b0: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
43c0: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
43d0: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
43e0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
43f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4400: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4430: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4440: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
4450: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
4460: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4470: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
4480: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
4490: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
44a0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
44b0: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
44c0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
44d0: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
44e0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
4510: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4520: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
4560: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4570: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
4580: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
45b0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
45c0: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
45d0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
4600: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
4610: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
4640: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
4650: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
4660: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
4690: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
46a0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
46b0: 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Seq==1 );.  asse
46c0: 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20  rt( nData==1 || 
46d0: 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67  regData==regOrig
46e0: 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44  Data || regOrigD
46f0: 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
4700: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
4710: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
4720: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
4730: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
4740: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70  = regData - nExp
4750: 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73  r - bSeq;.  }els
4760: 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  e{.    regBase =
4770: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
4780: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
4790: 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20  Mem += nBase;.  
47a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  }.  assert( pSel
47b0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20  ect->iOffset==0 
47c0: 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  || pSelect->iLim
47d0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69  it!=0 );.  iLimi
47e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  t = pSelect->iOf
47f0: 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e  fset ? pSelect->
4800: 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c  iOffset+1 : pSel
4810: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70  ect->iLimit;.  p
4820: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20  Sort->labelDone 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c  eLabel(v);.  sql
4850: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4860: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
4870: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  rt->pOrderBy, re
4880: 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61  gBase, regOrigDa
4890: 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
48b0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20  LITE_ECEL_DUP | 
48c0: 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51  (regOrigData? SQ
48d0: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20  LITE_ECEL_REF : 
48e0: 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  0));.  if( bSeq 
48f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4900: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4910: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4920: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4930: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
4940: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
4950: 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a  0 && nData>0 ){.
4960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4970: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
4980: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
4990: 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61  +nExpr+bSeq, nDa
49a0: 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ta);.  }.  sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
49c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
49d0: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
49e0: 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67  Base-nOBSat, reg
49f0: 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e  Record);.  if( n
4a00: 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69  OBSat>0 ){.    i
4a10: 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20  nt regPrevKey;  
4a20: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f   /* The first nO
4a30: 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  BSat columns of 
4a40: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
4a50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4a60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64  First;    /* Add
4a70: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49  ress of the OP_I
4a80: 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  fNot opcode */. 
4a90: 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20     int addrJmp; 
4aa0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4ab0: 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f  of the OP_Jump o
4ac0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62  pcode */.    Vdb
4ad0: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f  eOp *pOp;      /
4ae0: 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70  * Opcode that op
4af0: 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a  ens the sorter *
4b00: 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20  /.    int nKey; 
4b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b20: 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79  r of sorting key
4b30: 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64   columns, includ
4b40: 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  ing OP_Sequence 
4b50: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
4b60: 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  pKI;     /* Orig
4b70: 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20  inal KeyInfo on 
4b80: 74 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65  the sorter table
4b90: 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76   */..    regPrev
4ba0: 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Key = pParse->nM
4bb0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4bc0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d  ->nMem += pSort-
4bd0: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65  >nOBSat;.    nKe
4be0: 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72  y = nExpr - pSor
4bf0: 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71  t->nOBSat + bSeq
4c00: 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29  ;.    if( bSeq )
4c10: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4c20: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4c30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
4c40: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
4c50: 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ); .    }else{. 
4c60: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
4c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c80: 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p1(v, OP_Sequenc
4c90: 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45  eTest, pSort->iE
4ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
4cb0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4cc0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4ce0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4cf0: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4d00: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4d10: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4d20: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
4d30: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
4d40: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
4d50: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4d60: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4d70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
4d80: 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b   + nData;.    pK
4d90: 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  I = pOp->p4.pKey
4da0: 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Info;.    memset
4db0: 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72  (pKI->aSortOrder
4dc0: 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69  , 0, pKI->nKeyFi
4dd0: 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f  eld); /* Makes O
4de0: 50 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20  P_Jump testable 
4df0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
4e00: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
4e10: 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34  , (char*)pKI, P4
4e20: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74  _KEYINFO);.    t
4e30: 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41  estcase( pKI->nA
4e40: 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e  llField > pKI->n
4e50: 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20  KeyField+2 );.  
4e60: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e70: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e90: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4ea0: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69       pKI->nAllFi
4ee0: 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65  eld-pKI->nKeyFie
4ef0: 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a  ld-1);.    addrJ
4f00: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
4f10: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
4f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
4f40: 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20  , addrJmp+1, 0, 
4f50: 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65  addrJmp+1); Vdbe
4f60: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4f70: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
4f80: 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ut = sqlite3Vdbe
4f90: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4fa0: 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75    pSort->regRetu
4fb0: 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
4fc0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
4fd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4fe0: 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72  _Gosub, pSort->r
4ff0: 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  egReturn, pSort-
5000: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
5010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5020: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
5030: 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45  orter, pSort->iE
5040: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
5050: 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20   iLimit ){.     
5060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5070: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
5080: 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c  iLimit, pSort->l
5090: 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20  abelDone);.     
50a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
50b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
50c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
50d0: 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20  v, addrFirst);. 
50e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
50f0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
5100: 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b  egBase, regPrevK
5110: 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  ey, pSort->nOBSa
5120: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5130: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
5140: 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69  ddrJmp);.  }.  i
5150: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
5160: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
5170: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
5180: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
5190: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
51a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
51b0: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
51c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
51d0: 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69  (v, op, pSort->i
51e0: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
51f0: 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
5200: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61             regBa
5210: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
5220: 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20  -nOBSat);.  if( 
5230: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
5240: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
5250: 72 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46  r1 = 0;.    /* F
5260: 69 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75  ill the sorter u
5270: 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
5280: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e   LIMIT+OFFSET en
5290: 74 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69  tries.  (The iLi
52a0: 6d 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73  mit.    ** regis
52b0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
52c0: 65 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66  ed with value of
52d0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20   LIMIT+OFFSET.) 
52e0: 20 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65   After the sorte
52f0: 72 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75  r.    ** fills u
5300: 70 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65  p, delete the le
5310: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
5320: 20 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61   sorter after ea
5330: 63 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a  ch insert..    *
5340: 2a 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20  * Thus we never 
5350: 68 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74  hold more than t
5360: 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  he LIMIT+OFFSET 
5370: 72 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61  rows in memory a
5380: 74 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64  t once */.    ad
5390: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
53a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
53b0: 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  otZero, iLimit);
53c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
53d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
53e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
53f0: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5400: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53  sor);.    if( pS
5410: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
5420: 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  erLoop ){.      
5430: 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
5440: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
5450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5460: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74  OP_Column, pSort
5470: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70  ->iECursor, nExp
5480: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  r, r1);.      Vd
5490: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
54a0: 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eq"));.    }.   
54b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
54c0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
54d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
54e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  );.    if( pSort
54f0: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
5500: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oop ){.      /* 
5510: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
5520: 70 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61  p is driven by a
5530: 6e 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61  n index such tha
5540: 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20  t values from.  
5550: 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
5560: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
5570: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20   inner loop are 
5580: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
5590: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   then.      ** i
55a0: 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20  mmediately jump 
55b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
55c0: 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65  ation of an inne
55d0: 72 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20  r loop if the.  
55e0: 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f      ** entry fro
55f0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74  m the current it
5600: 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  eration does not
5610: 20 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f   fit into the to
5620: 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54  p.      ** LIMIT
5630: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20  +OFFSET entries 
5640: 6f 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  of the sorter. *
5650: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b  /.      int iBrk
5660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
5670: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
5680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5690: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
56a0: 45 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  Eq, regBase+nExp
56b0: 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20  r, iBrk, r1);.  
56c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
56d0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
56e0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
56f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5710: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5720: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5730: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5740: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
5750: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
5760: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
5770: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
5780: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
5790: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
57a0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  s VM */.  int iO
57b0: 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52  ffset,      /* R
57c0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
57d0: 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
57e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  er */.  int iCon
57f0: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
5800: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
5810: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
5820: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f  d */.){.  if( iO
5830: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
5840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5850: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
5860: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5870: 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 1); VdbeCovera
5880: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
5890: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
58a0: 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ET"));.  }.}../*
58b0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
58c0: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
58d0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
58e0: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
58f0: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
5900: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
5910: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
5920: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
5930: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
5940: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
5950: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
5960: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
5970: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
5980: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5990: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
59a0: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
59b0: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
59c0: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
59d0: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
59e0: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
59f0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5a00: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5a10: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5a20: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
5a30: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
5a40: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
5a50: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
5a60: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
5a70: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
5a80: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5aa0: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5ab0: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5ac0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5ad0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5ae0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5af0: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5b00: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b20: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
5b30: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
5b40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
5b50: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
5b60: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
5b70: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
5b80: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5b90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5ba0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5bc0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5bd0: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5be0: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5bf0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5c10: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5c20: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
5c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c40: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
5c50: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c  nsert, iTab, r1,
5c60: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
5c70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
5c80: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
5c90: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
5ca0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5cb0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5cd0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
5ce0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
5cf0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
5d00: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
5d10: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
5d20: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
5d30: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
5d40: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
5d50: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
5d60: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
5d70: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
5d80: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
5d90: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
5da0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
5db0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
5dc0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
5dd0: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
5de0: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  y .** to get the
5df0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
5e00: 6e 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61  ns and the colla
5e10: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
5e20: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
5e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
5e40: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
5e50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5e70: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
5e80: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5ea0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
5eb0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
5ec0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
5ed0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
5ee0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
5ef0: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
5f00: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
5f10: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
5f20: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
5f30: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
5f40: 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  e */.  SortCtx *
5f50: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f  pSort,         /
5f60: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
5f70: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
5f80: 6f 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a  ocess ORDER BY *
5f90: 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
5fa0: 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49  *pDistinct, /* I
5fb0: 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f  f not NULL, info
5fc0: 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65   on how to proce
5fd0: 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20  ss DISTINCT */. 
5fe0: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
5ff0: 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  st,      /* How 
6000: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68  to dispose of th
6010: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  e results */.  i
6020: 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20  nt iContinue,   
6030: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
6040: 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
6050: 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f  with next row */
6060: 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
6070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
6080: 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b  mp here to break
6090: 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65   out of the inne
60a0: 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56  r loop */.){.  V
60b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
60c0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
60d0: 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e  .  int hasDistin
60e0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ct;            /
60f0: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
6100: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
6110: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
6120: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
6130: 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f  ->eDest;   /* Ho
6140: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
6150: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
6160: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
6170: 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73  iSDParm; /* Firs
6180: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69  t argument to di
6190: 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f  sposal method */
61a0: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f  .  int nResultCo
61b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
61c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
61d0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
61e0: 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d  int nPrefixReg =
61f0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;         /* N
6200: 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72  umber of extra r
6210: 65 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20  egisters before 
6220: 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20  regResult */..  
6230: 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52  /* Usually, regR
6240: 65 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72  esult is the fir
6250: 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72  st cell in an ar
6260: 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  ray of memory ce
6270: 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  lls.  ** contain
6280: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
6290: 72 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74  result row. In t
62a0: 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67  his case regOrig
62b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20   is set to the. 
62c0: 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20   ** same value. 
62d0: 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
62e0: 72 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e  results are bein
62f0: 67 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f  g sent to the so
6300: 72 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76  rter, the.  ** v
6310: 61 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78  alues for any ex
6320: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
6330: 72 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20  re also part of 
6340: 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65  the sort-key are
6350: 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72   omitted.  ** fr
6360: 6f 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49  om this array. I
6370: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
6380: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65  rig is set to ze
6390: 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ro.  */.  int re
63a0: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
63b0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
63c0: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
63d0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73   current results
63e0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
63f0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
6400: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
6410: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c  mory holding ful
6420: 6c 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20  l result (or 0) 
6430: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
6440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  );.  assert( pEL
6450: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
6460: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
6470: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
6480: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
6490: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
64a0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
64b0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
64c0: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
64d0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
64e0: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
64f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
6500: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
6510: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
6520: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
6530: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
6540: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
6550: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
6560: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
6570: 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   = pEList->nExpr
6580: 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ;..  if( pDest->
6590: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
65a0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
65b0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20     nPrefixReg = 
65c0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
65d0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  >nExpr;.      if
65e0: 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46  ( !(pSort->sortF
65f0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
6600: 55 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72  UseSorter) ) nPr
6610: 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20  efixReg++;.     
6620: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6630: 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20   nPrefixReg;.   
6640: 20 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53   }.    pDest->iS
6650: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
6660: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
6670: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
6680: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
6690: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
66a0: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
66b0: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
66c0: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
66d0: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
66e0: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
66f0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
6700: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
6710: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
6720: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
6730: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
6740: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
6750: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
6760: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
6770: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
6780: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
6790: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
67a0: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
67b0: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
67c0: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
67d0: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
67e0: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
67f0: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
6800: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
6810: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
6820: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
6830: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
6840: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
6850: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
6860: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
6870: 20 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65   regOrig = regRe
6880: 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53  sult = pDest->iS
6890: 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61  dst;.  if( srcTa
68a0: 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  b>=0 ){.    for(
68b0: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
68c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
68d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
68e0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
68f0: 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73  rcTab, i, regRes
6900: 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  ult+i);.      Vd
6910: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
6920: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
6930: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
6940: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
6950: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
6960: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
6970: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
6980: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
6990: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
69a0: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
69b0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
69c0: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
69d0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
69e0: 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61  /.    u8 ecelFla
69f0: 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  gs;.    if( eDes
6a00: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
6a10: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6a20: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6a30: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
6a40: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c   ecelFlags = SQL
6a50: 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20  ITE_ECEL_DUP;.  
6a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
6a70: 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  celFlags = 0;.  
6a80: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
6a90: 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74  t && hasDistinct
6aa0: 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52  ==0 && eDest!=SR
6ab0: 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44  T_EphemTab && eD
6ac0: 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
6ad0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  {.      /* For e
6ae0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
6af0: 6e 20 70 45 4c 69 73 74 20 74 68 61 74 20 69 73  n pEList that is
6b00: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
6b10: 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20  pression in.    
6b20: 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
6b30: 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d  Y clause (pSort-
6b40: 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20  >pOrderBy), set 
6b50: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
6b60: 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42        ** iOrderB
6b70: 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e  yCol value to on
6b80: 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
6b90: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44  index of the ORD
6ba0: 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20  ER BY .      ** 
6bb0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69  expression withi
6bc0: 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74  n the sort-key t
6bd0: 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  hat pushOntoSort
6be0: 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61  er() will genera
6bf0: 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  te..      ** Thi
6c00: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 45 4c  s allows the pEL
6c10: 69 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20  ist field to be 
6c20: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
6c30: 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a   sorted record,.
6c40: 20 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20        ** saving 
6c50: 73 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79  space and CPU cy
6c60: 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cles.  */.      
6c70: 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51  ecelFlags |= (SQ
6c80: 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
6c90: 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  F|SQLITE_ECEL_RE
6ca0: 46 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  F);.      for(i=
6cb0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69  pSort->nOBSat; i
6cc0: 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  <pSort->pOrderBy
6cd0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6ce0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
6cf0: 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70        if( (j = p
6d00: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
6d10: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
6d20: 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
6d30: 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 6a       pEList->a[j
6d40: 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  -1].u.x.iOrderBy
6d50: 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d  Col = i+1-pSort-
6d60: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20  >nOBSat;.       
6d70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6d80: 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20   regOrig = 0;.  
6d90: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
6da0: 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44  t==SRT_Set || eD
6db0: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20  est==SRT_Mem .  
6dc0: 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73           || eDes
6dd0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6de0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f   || eDest==SRT_O
6df0: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20  utput );.    }. 
6e00: 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20     nResultCol = 
6e10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
6e20: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70  xprList(pParse,p
6e30: 45 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c  EList,regResult,
6e40: 30 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20  0,ecelFlags);.  
6e50: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
6e60: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
6e70: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
6e80: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6e90: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
6ea0: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
6eb0: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
6ec0: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
6ed0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
6ee0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
6ef0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
6f00: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69  tinct ){.    swi
6f10: 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  tch( pDistinct->
6f20: 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20  eTnctType ){.   
6f30: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
6f40: 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
6f50: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
6f60: 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
6f70: 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72    /* No longer r
6f80: 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65  equired OpenEphe
6f90: 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a  meral instr. */.
6fa0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
6fb0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
6fc0: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
6fd0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ion */.        i
6fe0: 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
6ff0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
7000: 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a  us row content *
7010: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  /..        /* Al
7020: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
7030: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
7040: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67  w */.        reg
7050: 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
7060: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  Mem+1;.        p
7070: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
7080: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20  ResultCol;..    
7090: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
70a0: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
70b0: 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
70c0: 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20   to an OP_Null. 
70d0: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74         ** sets t
70e0: 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62  he MEM_Cleared b
70f0: 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  it on the first 
7100: 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a  register of the.
7110: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
7120: 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ous value.  This
7130: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
7140: 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61  OP_Ne below to a
7150: 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a  lways.        **
7160: 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72   fail on the fir
7170: 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
7180: 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66  the loop even if
7190: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
71a0: 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c     ** row is all
71b0: 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20   NULLs..        
71c0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
71d0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
71e0: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
71f0: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
7200: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
7210: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44  3VdbeGetOp(v, pD
7220: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
7230: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  t);.        pOp-
7240: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c  >opcode = OP_Nul
7250: 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  l;.        pOp->
7260: 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
7270: 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65  pOp->p2 = regPre
7280: 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  v;..        iJum
7290: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
72a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
72b0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
72c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
72d0: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
72e0: 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  .          CollS
72f0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
7300: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
7310: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
7320: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
7330: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73        if( i<nRes
7340: 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ultCol-1 ){.    
7350: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7360: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7370: 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c  Ne, regResult+i,
7380: 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b   iJump, regPrev+
7390: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
73a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
73b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
73c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
73d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
73e0: 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73  v, OP_Eq, regRes
73f0: 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65  ult+i, iContinue
7400: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
7410: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
7420: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
7430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7440: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
7450: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f  ngeP4(v, -1, (co
7460: 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c  nst char *)pColl
7470: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
7480: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7490: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
74a0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a  SQLITE_NULLEQ);.
74b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
74c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
74d0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
74e0: 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50  (v)==iJump || pP
74f0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
7500: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
7510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7520: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op3(v, OP_Copy, 
7530: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72  regResult, regPr
7540: 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ev, nResultCol-1
7550: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
7560: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7570: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
7580: 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
7590: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
75a0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
75b0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
75c0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
75d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
75e0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
75f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7600: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
7610: 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
7620: 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
7630: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44  );.        codeD
7640: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
7650: 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e  pDistinct->tabTn
7660: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
7670: 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20  ResultCol,.     
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
76a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
76b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
76c0: 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20   pSort==0 ){.   
76d0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
76e0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
76f0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20  ntinue);.    }. 
7700: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44   }..  switch( eD
7710: 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  est ){.    /* In
7720: 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74   this mode, writ
7730: 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73  e each query res
7740: 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f  ult to the key o
7750: 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  f the temporary.
7760: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61      ** table iPa
7770: 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  rm..    */.#ifnd
7780: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
7790: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
77a0: 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f     case SRT_Unio
77b0: 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  n: {.      int r
77c0: 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  1;.      r1 = sq
77d0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
77e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
77f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7800: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
7810: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
7820: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20  esultCol, r1);. 
7830: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7840: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
7850: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
7860: 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c  , r1, regResult,
7870: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
7880: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
7890: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
78a0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
78b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
78c0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
78d0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
78e0: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
78f0: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
7900: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
7910: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
7920: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
7930: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
7940: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
7950: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
7960: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
7970: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
7980: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7990: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44  ddOp3(v, OP_IdxD
79a0: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65  elete, iParm, re
79b0: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
79c0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Col);.      brea
79d0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
79e0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
79f0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
7a00: 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  /..    /* Store 
7a10: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
7a20: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
7a30: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
7a40: 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a    case SRT_Fifo:
7a50: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69  .    case SRT_Di
7a60: 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65  stFifo:.    case
7a70: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
7a80: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
7a90: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
7aa0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
7ab0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
7ac0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7ad0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
7ae0: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
7af0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
7b00: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
7b10: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
7b20: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
7b30: 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20  =SRT_Fifo );.   
7b40: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7b50: 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
7b60: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
7b70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7b80: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
7b90: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
7ba0: 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  Col, r1+nPrefixR
7bb0: 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
7bc0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
7bd0: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
7be0: 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20  T_DistFifo ){.  
7bf0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
7c00: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44  destination is D
7c10: 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75  istFifo, then cu
7c20: 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69  rsor (iParm+1) i
7c30: 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  s open.        *
7c40: 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  * on an ephemera
7c50: 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20  l index. If the 
7c60: 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61  current row is a
7c70: 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20  lready present. 
7c80: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
7c90: 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77   index, do not w
7ca0: 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f  rite it to the o
7cb0: 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61  utput. If not, a
7cc0: 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  dd the.        *
7cd0: 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f  * current row to
7ce0: 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70   the index and p
7cf0: 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74  roceed with writ
7d00: 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20  ing it to the.  
7d10: 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
7d20: 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20  table as well.  
7d30: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
7d40: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
7d50: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
7d60: 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  + 4;.        sql
7d70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
7d80: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
7d90: 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31  Parm+1, addr, r1
7da0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64  , 0);.        Vd
7db0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
7dc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7dd0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
7de0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
7df0: 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75  rm+1, r1,regResu
7e00: 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  lt,nResultCol);.
7e10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7e20: 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pSort==0 );.    
7e30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
7e40: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
7e50: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
7e60: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
7e70: 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69  rt, p, r1+nPrefi
7e80: 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31  xReg,regResult,1
7e90: 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20  ,nPrefixReg);.  
7ea0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7eb0: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
7ec0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
7ed0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
7ee0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7ef0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
7f00: 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20   iParm, r2);.   
7f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7f20: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
7f30: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
7f40: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
7f50: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
7f60: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
7f70: 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  D);.        sqli
7f80: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7f90: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
7fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7fb0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7fc0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c  ange(pParse, r1,
7fd0: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7fe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7ff0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
8000: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8010: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
8020: 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
8030: 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
8040: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
8050: 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
8060: 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
8070: 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
8080: 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
8090: 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
80a0: 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
80b0: 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
80c0: 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
80d0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
80e0: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
80f0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8100: 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20      /* At first 
8110: 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64  glance you would
8120: 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20   think we could 
8130: 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65  optimize out the
8140: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
8150: 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73  R BY in this cas
8160: 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65  e since the orde
8170: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
8180: 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
8190: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ** does not matt
81a0: 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d  er.  But there m
81b0: 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20  ight be a LIMIT 
81c0: 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68  clause, in which
81d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
81e0: 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
81f0: 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  matter */.      
8200: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
8210: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
8220: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
8230: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
8240: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  ig, nResultCol, 
8250: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
8260: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8270: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
8280: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
8290: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rse);.        as
82a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72  sert( sqlite3Str
82b0: 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66  len30(pDest->zAf
82c0: 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43  fSdst)==nResultC
82d0: 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ol );.        sq
82e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
82f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8300: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
8310: 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20  sultCol, .      
8320: 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d        r1, pDest-
8330: 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75  >zAffSdst, nResu
8340: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
8350: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
8360: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
8370: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
8380: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
8390: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
83a0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
83b0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
83c0: 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c  rm, r1, regResul
83d0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
83e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
83f0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
8400: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
8410: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
8420: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
8430: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
8440: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8450: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
8460: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
8470: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8480: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
8490: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
84a0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
84b0: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
84c0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
84d0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
84e0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
84f0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
8500: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
8510: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
8520: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
8530: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
8540: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
8550: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
8560: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
8570: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8580: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61  memory cell or a
8590: 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20  rray of .    ** 
85a0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64  memory cells and
85b0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
85c0: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
85d0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
85e0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Mem: {.      if
85f0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
8600: 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75     assert( nResu
8610: 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53  ltCol<=pDest->nS
8620: 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  dst );.        p
8630: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
8640: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
8650: 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67  e, pSort, p, reg
8660: 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c  Result, regOrig,
8670: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72   nResultCol, nPr
8680: 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20  efixReg);.      
8690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
86a0: 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f  ssert( nResultCo
86b0: 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  l==pDest->nSdst 
86c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
86d0: 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50  t( regResult==iP
86e0: 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  arm );.        /
86f0: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
8700: 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
8710: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
8720: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20   us */.      }. 
8730: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8740: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
8750: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8760: 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
8770: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
8780: 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65  ine:       /* Se
8790: 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d  nd data to a co-
87a0: 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63  routine */.    c
87b0: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
87c0: 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  {        /* Retu
87d0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a  rn the results *
87e0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
87f0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
8800: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
8810: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8820: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
8830: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
8840: 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e  {.        pushOn
8850: 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c  toSorter(pParse,
8860: 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65   pSort, p, regRe
8870: 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e  sult, regOrig, n
8880: 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20  ResultCol,.     
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88a0: 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20    nPrefixReg);. 
88b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65       }else if( e
88c0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
88d0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ine ){.        s
88e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
88f0: 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
8900: 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
8910: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8930: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
8940: 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74  ltRow, regResult
8950: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
8960: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
8970: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
8980: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
8990: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
89a0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Col);.      }.  
89b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
89c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
89d0: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a  _OMIT_CTE.    /*
89e0: 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   Write the resul
89f0: 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69  ts into a priori
8a00: 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73  ty queue that is
8a10: 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67   order according
8a20: 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74   to.    ** pDest
8a30: 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70  ->pOrderBy (in p
8a40: 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44  SO).  pDest->iSD
8a50: 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20  Parm (in iParm) 
8a60: 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f  is the cursor fo
8a70: 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65  r an.    ** inde
8a80: 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70  x with pSO->nExp
8a90: 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75  r+2 columns.  Bu
8aa0: 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20  ild a key using 
8ab0: 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73  pSO for the firs
8ac0: 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45  t.    ** pSO->nE
8ad0: 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  xpr columns, the
8ae0: 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  n make sure all 
8af0: 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20  keys are unique 
8b00: 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20  by adding a.    
8b10: 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75  ** final OP_Sequ
8b20: 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  ence column.  Th
8b30: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73  e last column is
8b40: 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61   the record as a
8b50: 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20   blob..    */.  
8b60: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51    case SRT_DistQ
8b70: 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53  ueue:.    case S
8b80: 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20  RT_Queue: {.    
8b90: 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20    int nKey;.    
8ba0: 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
8bb0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
8bc0: 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Test = 0;.      
8bd0: 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20  ExprList *pSO;. 
8be0: 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74       pSO = pDest
8bf0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
8c00: 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b    assert( pSO );
8c10: 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53  .      nKey = pS
8c20: 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  O->nExpr;.      
8c30: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
8c40: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
8c50: 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74        r2 = sqlit
8c60: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
8c70: 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a  Parse, nKey+2);.
8c80: 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b        r3 = r2+nK
8c90: 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ey+1;.      if( 
8ca0: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
8cb0: 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ueue ){.        
8cc0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
8cd0: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65  ation is DistQue
8ce0: 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  ue, then cursor 
8cf0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
8d00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
8d10: 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72  a second ephemer
8d20: 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  al index that ho
8d30: 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65  lds all values e
8d40: 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a  very previously.
8d50: 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
8d60: 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a   to the queue. *
8d70: 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65  /.        addrTe
8d80: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
8d90: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
8da0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
8db0: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52              regR
8de0: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
8df0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  l);.        Vdbe
8e00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
8e10: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8e20: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8e30: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
8e40: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8e50: 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20  tCol, r3);.     
8e60: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
8e70: 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20  DistQueue ){.   
8e80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
8ea0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c  Insert, iParm+1,
8eb0: 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r3);.        sq
8ec0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
8ed0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
8ee0: 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20  EEKRESULT);.    
8ef0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
8f00: 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b  0; i<nKey; i++){
8f10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8f20: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8f30: 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20  _SCopy,.        
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53    regResult + pS
8f60: 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  O->a[i].u.x.iOrd
8f70: 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20  erByCol - 1,.   
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20         r2+i);.  
8fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8fb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8fc0: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50   OP_Sequence, iP
8fd0: 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20  arm, r2+nKey);. 
8fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ff0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
9000: 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65  eRecord, r2, nKe
9010: 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  y+2, r1);.      
9020: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9030: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
9040: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
9050: 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20   r2, nKey+2);.  
9060: 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74      if( addrTest
9070: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
9080: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65  mpHere(v, addrTe
9090: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
90a0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
90b0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
90c0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
90d0: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
90e0: 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b  se, r2, nKey+2);
90f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9100: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
9110: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
9120: 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ....#if !defined
9130: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
9140: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
9150: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
9160: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
9170: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
9180: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
9190: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
91a0: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
91b0: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
91c0: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
91d0: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
91e0: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
91f0: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
9200: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
9210: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
9220: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
9230: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
9240: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
9250: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
9260: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
9270: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
9280: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9290: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
92a0: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
92b0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
92c0: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
92d0: 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65  s reached.  Exce
92e0: 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72  pt, if.  ** ther
92f0: 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69  e is a sorter, i
9300: 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
9310: 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65   sorter has alre
9320: 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a  ady limited.  **
9330: 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20   the output for 
9340: 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  us..  */.  if( p
9350: 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c  Sort==0 && p->iL
9360: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
9370: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9380: 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
9390: 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
93a0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
93b0: 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ge(v);.  }.}../*
93c0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b  .** Allocate a K
93d0: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75  eyInfo object su
93e0: 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20  fficient for an 
93f0: 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63  index of N key c
9400: 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20  olumns and.** X 
9410: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  extra columns..*
9420: 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
9430: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73  e3KeyInfoAlloc(s
9440: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
9450: 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74  N, int X){.  int
9460: 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a   nExtra = (N+X)*
9470: 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
9480: 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f  )+1) - sizeof(Co
9490: 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e  llSeq*);.  KeyIn
94a0: 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44  fo *p = sqlite3D
94b0: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
94c0: 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
94d0: 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66   + nExtra);.  if
94e0: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53  ( p ){.    p->aS
94f0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
9500: 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a  &p->aColl[N+X];.
9510: 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64      p->nKeyField
9520: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
9530: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75  ->nAllField = (u
9540: 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d  16)(N+X);.    p-
9550: 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  >enc = ENC(db);.
9560: 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a      p->db = db;.
9570: 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
9580: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31  .    memset(&p[1
9590: 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20  ], 0, nExtra);. 
95a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
95b0: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
95c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
95d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
95e0: 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f  cate a KeyInfo o
95f0: 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  bject.*/.void sq
9600: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
9610: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
9620: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
9630: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
9640: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d  );.    p->nRef--
9650: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  ;.    if( p->nRe
9660: 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62  f==0 ) sqlite3Db
9670: 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29  FreeNN(p->db, p)
9680: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
9690: 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  ake a new pointe
96a0: 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f  r to a KeyInfo o
96b0: 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  bject.*/.KeyInfo
96c0: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
96d0: 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  Ref(KeyInfo *p){
96e0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
96f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e  assert( p->nRef>
9700: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  0 );.    p->nRef
9710: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
9720: 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   p;.}..#ifdef SQ
9730: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
9740: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
9750: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
9760: 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20   can be change. 
9770: 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   The KeyInfo obj
9780: 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20  ect.** can only 
9790: 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68  be changed if th
97a0: 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e  is is just a sin
97b0: 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  gle reference to
97c0: 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a   the object..**.
97d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
97e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73  is used only ins
97f0: 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20  ide of assert() 
9800: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
9810: 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  nt sqlite3KeyInf
9820: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79  oIsWriteable(Key
9830: 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e  Info *p){ return
9840: 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23   p->nRef==1; }.#
9850: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9860: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
9870: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
9880: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
9890: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
98a0: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
98b0: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
98c0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
98d0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
98e0: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
98f0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
9900: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
9910: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
9920: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
9930: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
9940: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
9950: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
9960: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
9970: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
9980: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
9990: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
99a0: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
99b0: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
99c0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
99d0: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
99e0: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
99f0: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
9a00: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
9a10: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
9a20: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
9a30: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
9a40: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
9a50: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
9a60: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
9a70: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
9a80: 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61   malloc.  The ca
9a90: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
9aa0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
9ab0: 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74   for seeing that
9ac0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
9ad0: 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
9ae0: 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
9af0: 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e  c KeyInfo *keyIn
9b00: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  foFromExprList(.
9b10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9b20: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
9b30: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9b40: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
9b50: 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20      /* Form the 
9b60: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66  KeyInfo object f
9b70: 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73  rom this ExprLis
9b80: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  t */.  int iStar
9b90: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
9ba0: 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63  egin with this c
9bb0: 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a  olumn of pList *
9bc0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20  /.  int nExtra  
9bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
9be0: 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20  this many extra 
9bf0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65  columns to the e
9c00: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nd */.){.  int n
9c10: 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Expr;.  KeyInfo 
9c20: 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  *pInfo;.  struct
9c30: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9c40: 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
9c50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9c60: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  b;.  int i;..  n
9c70: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
9c80: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
9c90: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
9ca0: 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74  oc(db, nExpr-iSt
9cb0: 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a  art, nExtra+1);.
9cc0: 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
9cd0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9ce0: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
9cf0: 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20  able(pInfo) );. 
9d00: 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c     for(i=iStart,
9d10: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b   pItem=pList->a+
9d20: 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b  iStart; i<nExpr;
9d30: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
9d40: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
9d50: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
9d60: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
9d70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
9d80: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
9d90: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
9da0: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
9db0: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49  ltColl;.      pI
9dc0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74  nfo->aColl[i-iSt
9dd0: 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  art] = pColl;.  
9de0: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74      pInfo->aSort
9df0: 4f 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20  Order[i-iStart] 
9e00: 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  = pItem->sortOrd
9e10: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  er;.    }.  }.  
9e20: 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a  return pInfo;.}.
9e30: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
9e40: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
9e50: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
9e60: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
9e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
9e80: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
9e90: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
9ea0: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
9eb0: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
9ec0: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
9ed0: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
9ee0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9ef0: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
9f00: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
9f10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
9f20: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
9f30: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
9f40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
9f50: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
9f60: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
9f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
9f80: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
9f90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9fa0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
9fb0: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
9fc0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
9fd0: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
9fe0: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
9ff0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
a000: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
a010: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
a020: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
a030: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
a040: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
a050: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
a060: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
a070: 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54     "USE TEMP B-T
a080: 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a  REE FOR xxx".**.
a090: 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20  ** where xxx is 
a0a0: 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54  one of "DISTINCT
a0b0: 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72  ", "ORDER BY" or
a0c0: 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61   "GROUP BY". Exa
a0d0: 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73  ctly which.** is
a0e0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
a0f0: 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65  he zUsage argume
a100: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
a110: 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  id explainTempTa
a120: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
a130: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
a140: 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  Usage){.  if( pP
a150: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
a160: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
a170: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a180: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
a190: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
a1a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53  (pParse->db, "US
a1b0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
a1c0: 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a  R %s", zUsage);.
a1d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a1e0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
a1f0: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
a200: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
a210: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
a220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  .  }.}../*.** As
a230: 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  sign expression 
a240: 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41  b to lvalue a. A
a250: 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20   second, no-op, 
a260: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20  version of this 
a270: 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76  macro.** is prov
a280: 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  ided when SQLITE
a290: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
a2a0: 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61   defined. This a
a2b0: 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a  llows the code.*
a2c0: 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  * in sqlite3Sele
a2d0: 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76  ct() to assign v
a2e0: 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75  alues to structu
a2f0: 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  re member variab
a300: 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79  les that.** only
a310: 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45   exist if SQLITE
a320: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
a330: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74   not defined wit
a340: 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74  hout polluting t
a350: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20  he.** code with 
a360: 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76  #ifndef directiv
a370: 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20  es..*/.# define 
a380: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
a390: 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23  r(a, b) a = b..#
a3a0: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
a3b0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
a3c0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
a3d0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
a3e0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
a3f0: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c  lainTempTable(y,
a400: 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  z).# define expl
a410: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c  ainSetInteger(y,
a420: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  z).#endif..#if !
a430: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a440: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20  MIT_EXPLAIN) && 
a450: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a460: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
a470: 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  LECT)./*.** Unle
a480: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
a490: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
a4a0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
a4b0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
a4c0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
a4d0: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
a4e0: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
a4f0: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
a500: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
a510: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
a520: 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20  ption is of one 
a530: 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73  of the two forms
a540: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  :.**.**   "COMPO
a550: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
a560: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
a570: 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50  (op)".**   "COMP
a580: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
a590: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
a5a0: 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52   USING TEMP B-TR
a5b0: 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77  EE (op)".**.** w
a5c0: 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69  here iSub1 and i
a5d0: 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74  Sub2 are the int
a5e0: 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20  egers passed as 
a5f0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
a600: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61  g.** function pa
a610: 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70  rameters, and op
a620: 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70   is the text rep
a630: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
a640: 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  he parameter.** 
a650: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
a660: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
a670: 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65  "op" must be one
a680: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
a690: 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49  _EXCEPT,.** TK_I
a6a0: 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41  NTERSECT or TK_A
a6b0: 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f  LL. The first fo
a6c0: 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72  rm is used if ar
a6d0: 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69  gument bUseTmp i
a6e0: 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20  s .** false, or 
a6f0: 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  the second form 
a700: 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a  if it is true..*
a710: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
a720: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a  plainComposite(.
a730: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
a760: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
a790: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
a7a0: 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20  XCEPT etc. */.  
a7b0: 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20  int iSub1,      
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31  /* Subquery id 1
a7e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c   */.  int iSub2,
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
a810: 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20  y id 2 */.  int 
a820: 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20  bUseTmp         
a830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a840: 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61  rue if a temp ta
a850: 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a  ble was used */.
a860: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ){.  assert( op=
a870: 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d  =TK_UNION || op=
a880: 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
a890: 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c  ==TK_INTERSECT |
a8a0: 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a  | op==TK_ALL );.
a8b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
a8c0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
a8d0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a8e0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
a8f0: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
a900: 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  3MPrintf(.      
a910: 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43    pParse->db, "C
a920: 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49  OMPOUND SUBQUERI
a930: 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28  ES %d AND %d %s(
a940: 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75  %s)", iSub1, iSu
a950: 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65  b2,.        bUse
a960: 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20  Tmp?"USING TEMP 
a970: 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c  B-TREE ":"", sel
a980: 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20  ectOpName(op).  
a990: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
a9a0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
a9b0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
a9c0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
a9d0: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
a9e0: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  MIC);.  }.}.#els
a9f0: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
aa00: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
aa10: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
aa20: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
aa30: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
aa40: 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78  nComposite(v,w,x
aa50: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y,z).#endif../*
aa60: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
aa70: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
aa80: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
aa90: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
aaa0: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
aab0: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
aac0: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
aad0: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
aae0: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
aaf0: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
ab00: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
ab10: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
ab20: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
ab30: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
ab40: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
ab50: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
ab60: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
ab70: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
ab80: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
ab90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
aba0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
abb0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
abc0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
abd0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
abe0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
abf0: 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  rt,   /* Informa
ac00: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45  tion on the ORDE
ac10: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
ac20: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
ac30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ac40: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
ac50: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
ac60: 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20  *pDest /* Write 
ac70: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
ac80: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
ac90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
aca0: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
acc0: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
acd0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
ace0: 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72  addrBreak = pSor
acf0: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20  t->labelDone;   
ad00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
ad10: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
ad20: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
ad30: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
ad40: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ad50: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
ad60: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
ad70: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a   */.  int addr;.
ad80: 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d    int addrOnce =
ad90: 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a   0;.  int iTab;.
ada0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
adb0: 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f  erBy = pSort->pO
adc0: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44  rderBy;.  int eD
add0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
ade0: 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20  st;.  int iParm 
adf0: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
ae00: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a  ;.  int regRow;.
ae10: 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a    int regRowid;.
ae20: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e    int iCol;.  in
ae30: 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53  t nKey;.  int iS
ae40: 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20  ortTab;         
ae50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
ae60: 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65  ter cursor to re
ae70: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
ae80: 20 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20   nSortData;     
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aea0: 54 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20  Trailing values 
aeb0: 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72  to read from sor
aec0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a  ter */.  int i;.
aed0: 20 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20    int bSeq;     
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72    /* True if sor
af00: 74 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75  ter record inclu
af10: 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a  des seq. no. */.
af20: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
af30: 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d  t_item *aOutEx =
af40: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a   p->pEList->a;..
af50: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 42 72    assert( addrBr
af60: 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70  eak<0 );.  if( p
af70: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
af80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
af90: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
afa0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
afb0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
afc0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
afd0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
afe0: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
aff0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
b000: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
b010: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
b020: 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20  );.  }.  iTab = 
b030: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b  pSort->iECursor;
b040: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
b050: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
b060: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
b070: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d   || eDest==SRT_M
b080: 65 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77  em ){.    regRow
b090: 69 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52  id = 0;.    regR
b0a0: 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  ow = pDest->iSds
b0b0: 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61  t;.    nSortData
b0c0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
b0d0: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
b0e0: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
b0f0: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b100: 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69     regRow = sqli
b110: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
b120: 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29  pParse, nColumn)
b130: 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20  ;.    nSortData 
b140: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20  = nColumn;.  }. 
b150: 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79   nKey = pOrderBy
b160: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
b170: 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70  >nOBSat;.  if( p
b180: 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20  Sort->sortFlags 
b190: 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  & SORTFLAG_UseSo
b1a0: 72 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rter ){.    int 
b1b0: 72 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70  regSortOut = ++p
b1c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
b1d0: 20 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72   iSortTab = pPar
b1e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
b1f0: 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  if( pSort->label
b200: 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61  BkOut ){.      a
b210: 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65  ddrOnce = sqlite
b220: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
b230: 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76  P_Once); VdbeCov
b240: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
b250: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b260: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
b270: 50 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62  Pseudo, iSortTab
b280: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b  , regSortOut, nK
b290: 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b  ey+1+nSortData);
b2a0: 0a 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63  .    if( addrOnc
b2b0: 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  e ) sqlite3VdbeJ
b2c0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f  umpHere(v, addrO
b2d0: 6e 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  nce);.    addr =
b2e0: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
b2f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
b300: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
b310: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56  ddrBreak);.    V
b320: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b330: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
b340: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
b350: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
b360: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b370: 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
b380: 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f  ata, iTab, regSo
b390: 72 74 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29  rtOut, iSortTab)
b3a0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a  ;.    bSeq = 0;.
b3b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
b3c0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
b3d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b3e0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
b3f0: 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
b400: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64  rage(v);.    cod
b410: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
b420: 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69  ffset, addrConti
b430: 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54  nue);.    iSortT
b440: 61 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62  ab = iTab;.    b
b450: 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66  Seq = 1;.  }.  f
b460: 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65  or(i=0, iCol=nKe
b470: 79 2b 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44  y+bSeq; i<nSortD
b480: 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ata; i++){.    i
b490: 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66  nt iRead;.    if
b4a0: 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e  ( aOutEx[i].u.x.
b4b0: 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20  iOrderByCol ){. 
b4c0: 20 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75       iRead = aOu
b4d0: 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  tEx[i].u.x.iOrde
b4e0: 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65  rByCol-1;.    }e
b4f0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64  lse{.      iRead
b500: 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d   = iCol++;.    }
b510: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b520: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
b530: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69  umn, iSortTab, i
b540: 52 65 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b  Read, regRow+i);
b550: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
b560: 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45  ((v, "%s", aOutE
b570: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75  x[i].zName ? aOu
b580: 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61  tEx[i].zName : a
b590: 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29  OutEx[i].zSpan))
b5a0: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
b5b0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
b5c0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
b5d0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
b5e0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab: {.      sqli
b5f0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b600: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
b610: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
b620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b630: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
b640: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
b650: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
b660: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b670: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
b680: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
b690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b6a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b6b0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
b6c0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
b6d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
b6e0: 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53  Column==sqlite3S
b6f0: 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a  trlen30(pDest->z
b700: 41 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20  AffSdst) );.    
b710: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b720: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
b730: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  cord, regRow, nC
b740: 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c  olumn, regRowid,
b750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b760: 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
b770: 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  zAffSdst, nColum
b780: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
b790: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
b7a0: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
b7b0: 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e   regRow, nColumn
b7c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b7d0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
b7e0: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
b7f0: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20  Parm, regRowid, 
b800: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
b810: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b820: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52     }.    case SR
b830: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f  T_Mem: {.      /
b840: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
b850: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
b860: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
b870: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
b880: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b890: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
b8a0: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
b8b0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
b8c0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
b8d0: 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20  utine ); .      
b8e0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
b8f0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
b900: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
b910: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b920: 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ine );.      if(
b930: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
b940: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
b950: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b960: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
b970: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
b980: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
b990: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
b9a0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
b9b0: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
b9c0: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
b9d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b9f0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
ba00: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
ba10: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
ba20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ba30: 20 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77    }.  if( regRow
ba40: 69 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44  id ){.    if( eD
ba50: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a  est==SRT_Set ){.
ba60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
ba70: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
ba80: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43  arse, regRow, nC
ba90: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  olumn);.    }els
baa0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
bab0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
bac0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
bad0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bae0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
baf0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
bb00: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
bb10: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
bb20: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
bb30: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
bb40: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
bb50: 65 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d  e);.  if( pSort-
bb60: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
bb70: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20  TFLAG_UseSorter 
bb80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
bb90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
bba0: 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c  orterNext, iTab,
bbb0: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
bbc0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rage(v);.  }else
bbd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
bbe0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
bbf0: 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b  xt, iTab, addr);
bc00: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
bc10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72  ;.  }.  if( pSor
bc20: 74 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73  t->regReturn ) s
bc30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
bc40: 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70  (v, OP_Return, p
bc50: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29  Sort->regReturn)
bc60: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
bc70: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
bc80: 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a  ddrBreak);.}../*
bc90: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
bca0: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
bcb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
bcc0: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
bcd0: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
bce0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
bcf0: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
bd00: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
bd10: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
bd20: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
bd30: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
bd40: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
bd50: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
bd60: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
bd70: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
bd80: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
bd90: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
bda0: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
bdb0: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
bdc0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
bdd0: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
bde0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
bdf0: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
be00: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
be10: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
be20: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
be30: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
be40: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
be50: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
be60: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
be70: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
be80: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
be90: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
bea0: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
beb0: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
bec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
bed0: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
bee0: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
bef0: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
bf00: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
bf10: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
bf20: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
bf30: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
bf40: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
bf50: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
bf60: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
bf70: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
bf80: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
bf90: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
bfa0: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
bfb0: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
bfc0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
bfd0: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
bfe0: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
bff0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
c000: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
c010: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
c020: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
c030: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
c040: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
c050: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
c060: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
c070: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
c080: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
c090: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
c0a0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c0b0: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
c0c0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
c0d0: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
c0e0: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c  nTypeImpl(A,B,C,
c0f0: 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20  D,E,F).#else /* 
c100: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
c110: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
c120: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
c130: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
c140: 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63  e(A,B,C,D,E,F) c
c150: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
c160: 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  B,F).#endif.stat
c170: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
c180: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
c190: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
c1a0: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
c1b0: 72 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r,.#ifdef SQLITE
c1c0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c1d0: 45 54 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20  ETADATA.  const 
c1e0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c  char **pzOrigDb,
c1f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
c200: 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e  pzOrigTab,.  con
c210: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
c220: 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38  Col,.#endif.  u8
c230: 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20   *pEstWidth.){. 
c240: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
c250: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
c260: 0a 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d  .  u8 estWidth =
c270: 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
c280: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c290: 4d 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20  METADATA.  char 
c2a0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d  const *zOrigDb =
c2b0: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
c2c0: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
c2d0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
c2e0: 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64  rigCol = 0;.#end
c2f0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45  if..  assert( pE
c300: 78 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  xpr!=0 );.  asse
c310: 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  rt( pNC->pSrcLis
c320: 74 21 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68  t!=0 );.  switch
c330: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
c340: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43     case TK_AGG_C
c350: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
c360: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
c370: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
c380: 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  sion is a column
c390: 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  . Locate the tab
c3a0: 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  le the column is
c3b0: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   being.      ** 
c3c0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69  extracted from i
c3d0: 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53  n NameContext.pS
c3e0: 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62  rcList. This tab
c3f0: 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20  le may be real. 
c400: 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
c410: 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71   table or a subq
c420: 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  uery..      */. 
c430: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c440: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c450: 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74   /* Table struct
c460: 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78  ure column is ex
c470: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a  tracted from */.
c480: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
c490: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
c4a0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20    /* Select the 
c4b0: 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63  column is extrac
c4c0: 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20  ted from */.    
c4d0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78    int iCol = pEx
c4e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a  pr->iColumn;  /*
c4f0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
c500: 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   in pTab */.    
c510: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
c520: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
c530: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
c540: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
c550: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  p==TK_COLUMN );.
c560: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
c570: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
c580: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54       SrcList *pT
c590: 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  abList = pNC->pS
c5a0: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  rcList;.        
c5b0: 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69  for(j=0;j<pTabLi
c5c0: 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62  st->nSrc && pTab
c5d0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73  List->a[j].iCurs
c5e0: 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or!=pExpr->iTabl
c5f0: 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  e;j++);.        
c600: 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  if( j<pTabList->
c610: 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  nSrc ){.        
c620: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
c630: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
c640: 20 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61          pS = pTa
c650: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c  bList->a[j].pSel
c660: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ect;.        }el
c670: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  se{.          pN
c680: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
c690: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c6a0: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
c6b0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
c6c0: 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20  /* At one time, 
c6d0: 63 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45  code such as "SE
c6e0: 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68  LECT new.x" with
c6f0: 69 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75  in a trigger wou
c700: 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  ld.        ** ca
c710: 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69  use this conditi
c720: 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63  on to run.  Sinc
c730: 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20  e then, we have 
c740: 72 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77  restructured how
c750: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67  .        ** trig
c760: 67 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65  ger code is gene
c770: 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69  rated and so thi
c780: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  s condition is n
c790: 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20  o longer .      
c7a0: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48    ** possible. H
c7b0: 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73  owever, it can s
c7c0: 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72  till be true for
c7d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
c7e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
c7f0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20  following:.     
c800: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
c810: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
c820: 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b  t1(col INTEGER);
c830: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
c840: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e  LECT (SELECT t1.
c850: 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74  col) FROM FROM t
c860: 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  1;.        **.  
c870: 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f        ** when co
c880: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
c890: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
c8a0: 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20  ession "t1.col" 
c8b0: 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  in the .        
c8c0: 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49  ** sub-select. I
c8d0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74  n this case, set
c8e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
c8f0: 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20   to NULL, even. 
c900: 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68         ** though
c910: 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c   it should reall
c920: 79 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a  y be "INTEGER"..
c930: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
c940: 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
c950: 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20  t a problem, as 
c960: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
c970: 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e  of "t1.col" is n
c980: 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  ever.        ** 
c990: 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d  used. When colum
c9a0: 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65  nType() is calle
c9b0: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
c9c0: 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ion .        ** 
c9d0: 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29  "(SELECT t1.col)
c9e0: 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  ", the correct t
c9f0: 79 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ype is returned 
ca00: 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45  (see the TK_SELE
ca10: 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72  CT.        ** br
ca20: 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  anch below.  */.
ca30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ca40: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
ca50: 73 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45  sert( pTab && pE
ca60: 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20  xpr->pTab==pTab 
ca70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20  );.      if( pS 
ca80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
ca90: 65 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74  e "table" is act
caa0: 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65  ually a sub-sele
cab0: 63 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20  ct or a view in 
cac0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
cad0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
cae0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
caf0: 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  nt. Return the d
cb00: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
cb10: 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20  and origin.     
cb20: 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74     ** data for t
cb30: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  he result-set co
cb40: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d  lumn of the sub-
cb50: 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20  select..        
cb60: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  */.        if( i
cb70: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
cb80: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
cb90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
cba0: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
cbb0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
cbc0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
cbd0: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
cbe0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
cbf0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
cc00: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
cc10: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
cc20: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
cc30: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
cc40: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
cc50: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
cc60: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
cc70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
cc80: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
cc90: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
cca0: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
ccb0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
ccc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
ccd0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
cce0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
ccf0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
cd00: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
cd10: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
cd20: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
cd30: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
cd40: 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44  (&sNC, p,&zOrigD
cd50: 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72  b,&zOrigTab,&zOr
cd60: 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68  igCol, &estWidth
cd70: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
cd80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
cd90: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
cda0: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
cdb0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
cdc0: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
cdd0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
cde0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
cdf0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
ce00: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
ce10: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
ce20: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
ce30: 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  l) );.#ifdef SQL
ce40: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
ce50: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
ce60: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
ce70: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
ce80: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
ce90: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
cea0: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
ceb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cec0: 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20       zOrigCol = 
ced0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
cee0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
cef0: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
cf00: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61  3ColumnType(&pTa
cf10: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29  b->aCol[iCol],0)
cf20: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
cf30: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
cf40: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
cf50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cf60: 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62   zOrigTab = pTab
cf70: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
cf80: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
cf90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
cfa0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
cfb0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
cfc0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
cfd0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
cfe0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
cff0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
d000: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
d010: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
d020: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  #else.        if
d030: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
d040: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
d050: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
d060: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d070: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
d080: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61  3ColumnType(&pTa
d090: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29  b->aCol[iCol],0)
d0a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
d0b0: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
d0c0: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
d0d0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
d0e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d0f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
d100: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
d110: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
d120: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
d130: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
d140: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
d150: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
d160: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
d170: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
d180: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
d190: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
d1a0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
d1b0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
d1c0: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
d1d0: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
d1e0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
d1f0: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
d200: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
d210: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
d220: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
d230: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
d240: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
d250: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
d260: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
d270: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
d280: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
d290: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
d2a0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
d2b0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
d2c0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
d2d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
d2e0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
d2f0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
d300: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
d310: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
d320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d330: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
d340: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d350: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
d360: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
d370: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
d380: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
d390: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
d3a0: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
d3b0: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
d3c0: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
d3d0: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
d3e0: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
d3f0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74  endif.  if( pEst
d400: 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64  Width ) *pEstWid
d410: 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20  th = estWidth;. 
d420: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
d430: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d440: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
d450: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
d460: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
d470: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
d480: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
d490: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
d4a0: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
d4b0: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
d4c0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
d4d0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
d4e0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
d4f0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
d500: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
d510: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
d520: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
d530: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
d540: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
d550: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
d560: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
d570: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
d580: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
d590: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
d5a0: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
d5b0: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
d5c0: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
d5d0: 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e  pParse;.  sNC.pN
d5e0: 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ext = 0;.  for(i
d5f0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
d600: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
d610: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
d620: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
d630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
d640: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
d650: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
d660: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
d670: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
d680: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
d690: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
d6a0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
d6b0: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
d6c0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
d6d0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d6e0: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
d6f0: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
d700: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  , 0);..    /* Th
d710: 65 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65  e vdbe must make
d720: 20 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66   its own copy of
d730: 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65   the column-type
d740: 20 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20   and other .    
d750: 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66  ** column specif
d760: 69 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63  ic strings, in c
d770: 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69  ase the schema i
d780: 73 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74  s reset before t
d790: 68 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75  his.    ** virtu
d7a0: 61 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65  al machine is de
d7b0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
d7c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d7d0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d7e0: 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20  LNAME_DATABASE, 
d7f0: 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f  zOrigDb, SQLITE_
d800: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d810: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d820: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d830: 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67  AME_TABLE, zOrig
d840: 54 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Tab, SQLITE_TRAN
d850: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
d860: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d870: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
d880: 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c  COLUMN, zOrigCol
d890: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
d8a0: 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a  NT);.#else.    z
d8b0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
d8c0: 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
d8d0: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
d8e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d8f0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d900: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
d910: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
d920: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
d930: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
d940: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
d950: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f  CLTYPE) */.}.../
d960: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
d970: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
d980: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
d990: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
d9a0: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
d9b0: 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
d9c0: 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
d9d0: 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
d9e0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
d9f0: 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
da00: 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
da10: 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
da20: 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
da30: 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
da40: 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
da50: 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
da60: 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
da70: 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
da80: 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
da90: 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
daa0: 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
dab0: 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
dac0: 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
dad0: 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
dae0: 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
daf0: 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
db00: 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
db10: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
db20: 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
db30: 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
db40: 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
db50: 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c  ** See Also: sql
db60: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
db70: 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20  xprList().**.** 
db80: 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74  The PRAGMA short
db90: 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e  _column_names an
dba0: 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f  d PRAGMA full_co
dbb0: 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69  lumn_names setti
dbc0: 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65  ngs are.** depre
dbd0: 63 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61  cated.  The defa
dbe0: 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73  ult setting is s
dbf0: 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46  hort=ON, full=OF
dc00: 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c  F.  99.9% of all
dc10: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  .** applications
dc20: 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20   should operate 
dc30: 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72  this way.  Never
dc40: 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64  theless, we need
dc50: 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a   to support the.
dc60: 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66  ** other modes f
dc70: 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a  or legacy:.**.**
dc80: 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66      short=OFF, f
dc90: 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f  ull=OFF:      Co
dca0: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65  lumn name is the
dcb0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70   text of the exp
dcc0: 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a  ression has it.*
dcd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
dcf0: 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72  riginally appear
dd00: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
dd10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a  statement.  In.*
dd20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
dd40: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
dd50: 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73  zSpan of the res
dd60: 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ult expression..
dd70: 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f  **.**    short=O
dd80: 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20  N, full=OFF:    
dd90: 20 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20     (This is the 
dda0: 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29  default setting)
ddb0: 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
ddc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
ddf0: 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
de00: 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  mn, then the res
de10: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20      column name 
de40: 69 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c  is just the tabl
de50: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 43  e column name: C
de60: 4f 4c 55 4d 4e 2e 20 0a 2a 2a 20 20 20 20 20 20  OLUMN. .**      
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 20 20 20 20 20 4f 74 68 65 72 77 69 73          Otherwis
de90: 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a  e use zSpan..**.
dea0: 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73  **    full=ON, s
deb0: 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20  hort=ANY:       
dec0: 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
ded0: 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
dee0: 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
def0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df10: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
df20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74   column name wit
df30: 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
df40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42   prefix, ex: TAB
df70: 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65  LE.COLUMN.  Othe
df80: 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e  rwise use zSpan.
df90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dfa0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
dfb0: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
dfc0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
dfd0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
dfe0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
dff0: 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  t     /* Generat
e000: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
e010: 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73  or this SELECT s
e020: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
e030: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
e040: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
e050: 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  i;.  Table *pTab
e060: 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
e070: 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
e080: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
e090: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e0a0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
e0b0: 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42  lName;    /* TAB
e0c0: 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20  LE.COLUMN if no 
e0d0: 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73  AS clause and is
e0e0: 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
e0f0: 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ref */.  int src
e100: 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c  Name;     /* COL
e110: 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c  UMN or TABLE.COL
e120: 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
e130: 75 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63  use and is direc
e140: 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  t */..#ifndef SQ
e150: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
e160: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
e170: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
e180: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
e190: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
e1a0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
e1b0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
e1c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
e1d0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62  olNamesSet || db
e1e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e1f0: 20 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f   return;.  /* Co
e200: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64  lumn names are d
e210: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
e220: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
e230: 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
e240: 6c 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28  lect */.  while(
e250: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
e260: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
e270: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
e280: 70 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65  pTabList = pSele
e290: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69  ct->pSrc;.  pELi
e2a0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
e2b0: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
e2c0: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
e2d0: 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b  ( pTabList!=0 );
e2e0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
e2f0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
e300: 6c 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c  llName = (db->fl
e310: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
e320: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
e330: 20 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e   srcName = (db->
e340: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
e350: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
e360: 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20   || fullName;.  
e370: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
e380: 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d  mCols(v, pEList-
e390: 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69  >nExpr);.  for(i
e3a0: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
e3b0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
e3c0: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
e3d0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20  >a[i].pExpr;..  
e3e0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
e3f0: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
e400: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
e410: 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63        /* An AS c
e420: 6c 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b  lause always tak
e430: 65 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74  es first priorit
e440: 79 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  y */.      char 
e450: 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d  *zName = pEList-
e460: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[i].zName;.   
e470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
e480: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
e490: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
e4a0: 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  me, SQLITE_TRANS
e4b0: 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65  IENT);.    }else
e4c0: 20 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20   if( srcName && 
e4d0: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
e4e0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
e4f0: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
e500: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
e510: 6e 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  n;.      pTab = 
e520: 70 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 61  p->pTab;.      a
e530: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
e540: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
e550: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
e560: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61  ->iPKey;.      a
e570: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
e580: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
e590: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
e5a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
e5b0: 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  l<0 ){.        z
e5c0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
e5d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e5e0: 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
e5f0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
e600: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
e610: 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b   if( fullName ){
e620: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
e630: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
e640: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
e650: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
e660: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
e670: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
e680: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e690: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
e6a0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
e6b0: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
e6c0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
e6d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e6e0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
e6f0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
e700: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
e710: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
e720: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e730: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
e740: 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *z = pEList->a[i
e750: 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a  ].zSpan;.      z
e760: 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65   = z==0 ? sqlite
e770: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
e780: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20  lumn%d", i+1) : 
e790: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
e7a0: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  db, z);.      sq
e7b0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e7c0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
e7d0: 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54  E_NAME, z, SQLIT
e7e0: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
e7f0: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
e800: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
e810: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
e820: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
e830: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
e840: 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20  ion list (which 
e850: 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69  is really the li
e860: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
e870: 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74  s.** that form t
e880: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
e890: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
e8a0: 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70  ent) compute app
e8b0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75  ropriate.** colu
e8c0: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74  mn names for a t
e8d0: 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20  able that would 
e8e0: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
e8f0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
e900: 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  All column names
e910: 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e   will be unique.
e920: 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  .**.** Only the 
e930: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65  column names are
e940: 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75   computed.  Colu
e950: 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e  mn.zType, Column
e960: 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f  .zColl,.** and o
e970: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43  ther fields of C
e980: 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64  olumn are zeroed
e990: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
e9a0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
e9b0: 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72  ess.  If a memor
e9c0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
e9d0: 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74  or occurs,.** st
e9e0: 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43  ore NULL in *paC
e9f0: 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43  ol and 0 in *pnC
ea00: 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ol and return SQ
ea10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a  LITE_NOMEM..**.*
ea20: 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61  * The only guara
ea30: 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65  ntee that SQLite
ea40: 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c   makes about col
ea50: 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61  umn names is tha
ea60: 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  t if the.** colu
ea70: 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61  mn has an AS cla
ea80: 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74  use assigning it
ea90: 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69   a name, that wi
eaa0: 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75  ll be the name u
eab0: 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20  sed..** That is 
eac0: 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e  the only documen
ead0: 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20  ted guarantee.  
eae0: 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65  However, countle
eaf0: 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a  ss applications.
eb00: 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65  ** developed ove
eb10: 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65  r the years have
eb20: 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61   made baseless a
eb30: 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74  ssumptions about
eb40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a   column names.**
eb50: 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20   and will break 
eb60: 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74  if those assumpt
eb70: 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48  ions changes.  H
eb80: 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d  ence, use extrem
eb90: 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65  e caution.** whe
eba0: 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73  n modifying this
ebb0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69   routine to avoi
ebc0: 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63  d breaking legac
ebd0: 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73  y..**.** See Als
ebe0: 6f 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  o: generateColum
ebf0: 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20  nNames().*/.int 
ec00: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
ec10: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
ec20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ec30: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
ec40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
ec50: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
ec60: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
ec70: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
ec80: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
ec90: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
eca0: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
ecb0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
ecc0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
ecd0: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
ece0: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
ecf0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
ed00: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
ed10: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
ed20: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ed30: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
ed40: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
ed50: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
ed80: 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20  s */.  u32 cnt; 
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eda0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
edb0: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
edc0: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
edd0: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
ede0: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
edf0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
ee00: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
ee10: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
ee40: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
ee50: 74 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72 20  t set */.  char 
ee60: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
ee70: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
ee80: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
ee90: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
eea0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
eeb0: 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
eec0: 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20  ] */.  Hash ht; 
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eee0: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
eef0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73   of column names
ef00: 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61   */..  sqlite3Ha
ef10: 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69  shInit(&ht);.  i
ef20: 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20  f( pEList ){.   
ef30: 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e   nCol = pEList->
ef40: 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20  nExpr;.    aCol 
ef50: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ef60: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
ef70: 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b  (aCol[0])*nCol);
ef80: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61  .    testcase( a
ef90: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73  Col==0 );.  }els
efa0: 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  e{.    nCol = 0;
efb0: 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20  .    aCol = 0;. 
efc0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f   }.  assert( nCo
efd0: 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a  l==(i16)nCol );.
efe0: 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b    *pnCol = nCol;
eff0: 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c  .  *paCol = aCol
f000: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  ;..  for(i=0, pC
f010: 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20  ol=aCol; i<nCol 
f020: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
f030: 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  iled; i++, pCol+
f040: 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
f050: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
f060: 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
f070: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
f080: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
f090: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
f0a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
f0b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
f0c0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
f0d0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
f0e0: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
f0f0: 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e */.    }else{.
f100: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
f110: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
f120: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
f130: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
f140: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
f150: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
f160: 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
f170: 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45  pColExpr = pColE
f180: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
f190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
f1a0: 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  lExpr!=0 );.    
f1b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43    }.      if( pC
f1c0: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  olExpr->op==TK_C
f1d0: 4f 4c 55 4d 4e 20 26 26 20 70 43 6f 6c 45 78 70  OLUMN && pColExp
f1e0: 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20  r->pTab!=0 ){.  
f1f0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
f200: 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c  umns use the col
f210: 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f  umn name name */
f220: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
f230: 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43  l = pColExpr->iC
f240: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54  olumn;.        T
f250: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43 6f  able *pTab = pCo
f260: 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  lExpr->pTab;.   
f270: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
f280: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
f290: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e  PKey;.        zN
f2a0: 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  ame = iCol>=0 ? 
f2b0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
f2c0: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
f2d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f2e0: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
f2f0: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
f300: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
f310: 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
f320: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
f330: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
f340: 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  e = pColExpr->u.
f350: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  zToken;.      }e
f360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
f370: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
f380: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
f390: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
f3a0: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
f3b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
f3c0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
f3d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f3e0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
f3f0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
f400: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
f410: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
f420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  else{.      zNam
f430: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
f440: 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22  tf(db,"column%d"
f450: 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ,i+1);.    }..  
f460: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f470: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
f480: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
f490: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
f4a0: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
f4b0: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
f4c0: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
f4d0: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
f4e0: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
f4f0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
f500: 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71  ile( zName && sq
f510: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 68  lite3HashFind(&h
f520: 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  t, zName)!=0 ){.
f530: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71        nName = sq
f540: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
f550: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
f560: 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20  nName>0 ){.     
f570: 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31     for(j=nName-1
f580: 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33  ; j>0 && sqlite3
f590: 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d  Isdigit(zName[j]
f5a0: 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20  ); j--){}.      
f5b0: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d    if( zName[j]==
f5c0: 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b  ':' ) nName = j;
f5d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
f5e0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
f5f0: 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a  rintf(db, "%.*z:
f600: 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  %u", nName, zNam
f610: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
f620: 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c   if( cnt>3 ) sql
f630: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
f640: 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e  sizeof(cnt), &cn
f650: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  t);.    }.    pC
f660: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
f670: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  e;.    sqlite3Co
f680: 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
f690: 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b  omName(0, pCol);
f6a0: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  .    if( zName &
f6b0: 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  & sqlite3HashIns
f6c0: 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20  ert(&ht, zName, 
f6d0: 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20  pCol)==pCol ){. 
f6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
f6f0: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ault(db);.    }.
f700: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
f710: 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69  hClear(&ht);.  i
f720: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f730: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
f740: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
f750: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
f760: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
f770: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
f780: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f790: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
f7a0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
f7b0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
f7c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f7d0: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
f7e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f7f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
f800: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
f810: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
f820: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
f830: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
f840: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
f850: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
f860: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
f870: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
f880: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
f890: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
f8a0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
f8b0: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
f8c0: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
f8d0: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
f8e0: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
f8f0: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
f900: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
f910: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
f920: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
f930: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
f940: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
f950: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
f960: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
f970: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
f980: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
f990: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
f9a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f9b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
f9c0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
f9d0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
f9e0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
f9f0: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
fa00: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
fa10: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
fa20: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
fa30: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
fa40: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
fa50: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
fa60: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
fa70: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
fa80: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
fa90: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
faa0: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
fab0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
fac0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
fad0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
fae0: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
faf0: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
fb00: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
fb10: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
fb20: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
fb30: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
fb40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
fb50: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
fb60: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
fb70: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
fb80: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
fb90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
fba0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
fbb0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
fbc0: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
fbd0: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
fbe0: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
fbf0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
fc00: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
fc10: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
fc20: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
fc30: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  pCol++){.    con
fc40: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
fc50: 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20      int n, m;.  
fc60: 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72    p = a[i].pExpr
fc70: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
fc80: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
fc90: 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 43 6f 6c  , 0, 0, 0, &pCol
fca0: 2d 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20 73 7a  ->szEst);.    sz
fcb0: 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45  All += pCol->szE
fcc0: 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66  st;.    pCol->af
fcd0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
fce0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b  ExprAffinity(p);
fcf0: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 20 26  .    if( zType &
fd00: 26 20 28 6d 20 3d 20 73 71 6c 69 74 65 33 53 74  & (m = sqlite3St
fd10: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 29 3e 30  rlen30(zType))>0
fd20: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71   ){.      n = sq
fd30: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43  lite3Strlen30(pC
fd40: 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ol->zName);.    
fd50: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
fd60: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
fd70: 4f 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  OrFree(db, pCol-
fd80: 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a  >zName, n+m+2);.
fd90: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
fda0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  zName ){.       
fdb0: 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a   memcpy(&pCol->z
fdc0: 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65  Name[n+1], zType
fdd0: 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , m+1);.        
fde0: 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c  pCol->colFlags |
fdf0: 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50  = COLFLAG_HASTYP
fe00: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
fe10: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61  .    if( pCol->a
fe20: 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f  ffinity==0 ) pCo
fe30: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
fe40: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20  LITE_AFF_BLOB;. 
fe50: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
fe60: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
fe70: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66  arse, p);.    if
fe80: 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d  ( pColl && pCol-
fe90: 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >zColl==0 ){.   
fea0: 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d     pCol->zColl =
feb0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
fec0: 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  (db, pColl->zNam
fed0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
fee0: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
fef0: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73   sqlite3LogEst(s
ff00: 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  zAll*4);.}../*.*
ff10: 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
ff20: 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
ff30: 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
ff40: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
ff50: 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
ff60: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
ff70: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
ff80: 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
ff90: 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
ffa0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
ffb0: 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
ffc0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
ffd0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
ffe0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
fff0: 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
10000 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
10010 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
10020 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
10030 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
10040 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
10050 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
10060 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
10070 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
10080 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
10090 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
100a0 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
100b0 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
100c0 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
100d0 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
100e0 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
100f0 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
10100 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
10110 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
10120 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
10130 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
10140 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
10150 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
10160 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
10170 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
10180 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
10190 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
101a0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
101b0 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
101c0 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
101d0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
101e0 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
101f0 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
10200 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
10210 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
10220 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
10230 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  576) );.  sqlite
10240 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
10250 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
10260 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
10270 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
10280 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
10290 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
102a0 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
102b0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
102c0 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
102d0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
102e0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
102f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
10300 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
10310 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
10320 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
10330 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
10340 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
10350 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
10360 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
10370 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
10380 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
10390 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
103a0 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
103b0 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
103c0 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
103d0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
103e0 4e 4f 49 4e 4c 49 4e 45 20 56 64 62 65 20 2a 61  NOINLINE Vdbe *a
103f0 6c 6c 6f 63 56 64 62 65 28 50 61 72 73 65 20 2a  llocVdbe(Parse *
10400 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
10410 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
10420 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  be = sqlite3Vdbe
10430 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a  Create(pParse);.
10440 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65    if( v ) sqlite
10450 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10460 50 5f 49 6e 69 74 2c 20 30 2c 20 31 29 3b 0a 20  P_Init, 0, 1);. 
10470 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f   if( pParse->pTo
10480 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20  plevel==0.   && 
10490 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
104a0 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53  led(pParse->db,S
104b0 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43  QLITE_FactorOutC
104c0 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70  onst).  ){.    p
104d0 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61  Parse->okConstFa
104e0 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ctor = 1;.  }.  
104f0 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 56 64 62 65  return v;.}.Vdbe
10500 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65   *sqlite3GetVdbe
10510 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
10520 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
10530 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 65  rse->pVdbe;.  re
10540 74 75 72 6e 20 76 20 3f 20 76 20 3a 20 61 6c 6c  turn v ? v : all
10550 6f 63 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  ocVdbe(pParse);.
10560 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
10570 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
10580 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
10590 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
105a0 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
105b0 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
105c0 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
105d0 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
105e0 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
105f0 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
10600 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
10610 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
10620 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
10630 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
10640 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
10650 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
10660 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
10670 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
10680 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
10690 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
106a0 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
106b0 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
106c0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
106d0 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
106e0 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
106f0 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
10700 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
10710 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
10720 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
10730 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
10740 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
10750 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
10760 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
10770 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
10780 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
10790 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
107a0 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
107b0 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
107c0 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
107d0 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
107e0 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
107f0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
10800 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72   (zero).** prior
10810 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
10820 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
10830 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69  The iOffset regi
10840 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73  ster (if it exis
10850 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ts) is initializ
10860 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ed to the value.
10870 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54  ** of the OFFSET
10880 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65  .  The iLimit re
10890 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
108a0 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20  lized to LIMIT. 
108b0 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66   Register.** iOf
108c0 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61  fset+1 is initia
108d0 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f  lized to LIMIT+O
108e0 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  FFSET..**.** Onl
108f0 79 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f  y if pLimit!=0 o
10900 72 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20  r pOffset!=0 do 
10910 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
10920 65 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66  ers get.** redef
10930 69 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e  ined.  The UNION
10940 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73   ALL operator us
10950 65 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79  es this property
10960 20 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65   to force.** the
10970 20 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61   reuse of the sa
10980 6d 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  me limit and off
10990 73 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63  set registers ac
109a0 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  ross multiple.**
109b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
109c0 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
109d0 69 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  id computeLimitR
109e0 65 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a  egisters(Parse *
109f0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
10a00 70 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a  p, int iBreak){.
10a10 20 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20    Vdbe *v = 0;. 
10a20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b   int iLimit = 0;
10a30 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
10a40 20 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70    int n;.  if( p
10a50 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
10a60 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
10a70 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
10a80 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
10a90 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
10aa0 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
10ab0 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
10ac0 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
10ad0 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
10ae0 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
10af0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
10b00 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
10b10 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
10b20 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
10b30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
10b40 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
10b50 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
10b60 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
10b70 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
10b80 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
10b90 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
10ba0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
10bb0 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
10bc0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
10bd0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
10be0 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  v!=0 );.    if( 
10bf0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
10c00 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20  eger(p->pLimit, 
10c10 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  &n) ){.      sql
10c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10c30 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c  , OP_Integer, n,
10c40 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
10c50 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10c60 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
10c70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  );.      if( n==
10c80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
10c90 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
10ca0 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
10cb0 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
10cc0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73   p->nSelectRow>s
10cd0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
10ce0 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  4)n) ){.        
10cf0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
10d00 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
10d10 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70  64)n);.        p
10d20 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
10d30 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20  _FixedLimit;.   
10d40 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
10d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10d60 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d  rCode(pParse, p-
10d70 3e 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29  >pLimit, iLimit)
10d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10d90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10da0 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69  MustBeInt, iLimi
10db0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
10dc0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
10dd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
10de0 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
10df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10e00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
10e10 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  t, iLimit, iBrea
10e20 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
10e30 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (v);.    }.    i
10e40 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
10e50 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
10e60 74 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b  t = iOffset = ++
10e70 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
10e80 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
10e90 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ++;   /* Allocat
10ea0 65 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73  e an extra regis
10eb0 74 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66  ter for limit+of
10ec0 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71  fset */.      sq
10ed0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
10ee0 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  arse, p->pOffset
10ef0 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
10f00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10f10 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
10f20 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56  Int, iOffset); V
10f30 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
10f40 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
10f50 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f  t((v, "OFFSET co
10f60 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
10f70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10f80 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
10f90 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  mit, iLimit, iOf
10fa0 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74 29  fset+1, iOffset)
10fb0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
10fc0 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
10fd0 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a  FFSET"));.    }.
10fe0 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
10ff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
11000 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
11010 20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   Return the appr
11020 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e  opriate collatin
11030 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
11040 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
11050 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75  n of.** the resu
11060 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63  lt set for the c
11070 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73  ompound-select s
11080 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52  tatement "p".  R
11090 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a  eturn NULL if.**
110a0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20   the column has 
110b0 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  no default colla
110c0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a  ting sequence..*
110d0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
110e0 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
110f0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
11100 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  ect is taken fro
11110 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f  m the.** left-mo
11120 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73  st term of the s
11130 65 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61  elect that has a
11140 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
11150 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  nce..*/.static C
11160 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c  ollSeq *multiSel
11170 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65  ectCollSeq(Parse
11180 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
11190 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a   *p, int iCol){.
111a0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b    CollSeq *pRet;
111b0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
111c0 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d   ){.    pRet = m
111d0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
111e0 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72  q(pParse, p->pPr
111f0 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65  ior, iCol);.  }e
11200 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  lse{.    pRet = 
11210 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
11220 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a   iCol>=0 );.  /*
11230 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65   iCol must be le
11240 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73  ss than p->pELis
11250 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72  t->nExpr.  Other
11260 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f  wise an error wo
11270 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  uld.  ** have be
11280 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67  en thrown during
11290 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
112a0 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f   and we would no
112b0 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20  t have gotten.  
112c0 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20  ** this far */. 
112d0 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
112e0 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70  ALWAYS(iCol<p->p
112f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
11300 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
11310 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
11320 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
11330 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29  ->a[iCol].pExpr)
11340 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
11350 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
11360 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
11370 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
11380 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
11390 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  r is a compound 
113a0 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61  SELECT.** with a
113b0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
113c0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
113d0 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72   allocates and r
113e0 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f  eturns a KeyInfo
113f0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75  .** structure su
11400 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65  itable for imple
11410 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45  menting the ORDE
11420 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  R BY..**.** Spac
11430 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
11440 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
11450 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
11460 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c   malloc. The cal
11470 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
11480 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
11490 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61  for ensuring tha
114a0 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
114b0 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
114c0 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
114d0 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74  ic KeyInfo *mult
114e0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
114f0 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
11500 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
11510 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45  int nExtra){.  E
11520 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
11530 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
11540 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20  .  int nOrderBy 
11550 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  = p->pOrderBy->n
11560 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20  Expr;.  sqlite3 
11570 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
11580 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65  ;.  KeyInfo *pRe
11590 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  t = sqlite3KeyIn
115a0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64  foAlloc(db, nOrd
115b0 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b  erBy+nExtra, 1);
115c0 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20  .  if( pRet ){. 
115d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
115e0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
115f0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  y; i++){.      s
11600 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
11610 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f  tem *pItem = &pO
11620 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20  rderBy->a[i];.  
11630 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20      Expr *pTerm 
11640 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
11650 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
11660 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28  Coll;..      if(
11670 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20   pTerm->flags & 
11680 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20  EP_Collate ){.  
11690 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
116a0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
116b0 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b  (pParse, pTerm);
116c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
116d0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75        pColl = mu
116e0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
116f0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65  (pParse, p, pIte
11700 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
11710 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ol-1);.        i
11720 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
11730 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
11740 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72  oll;.        pOr
11750 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
11760 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71  r =.          sq
11770 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
11780 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65  ateString(pParse
11790 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e  , pTerm, pColl->
117a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
117b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
117c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
117d0 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b  iteable(pRet) );
117e0 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f  .      pRet->aCo
117f0 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20  ll[i] = pColl;. 
11800 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74       pRet->aSort
11810 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65  Order[i] = pOrde
11820 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
11830 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  der;.    }.  }..
11840 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
11850 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11860 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
11870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
11880 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65  erates VDBE code
11890 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
118a0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54  content of a WIT
118b0 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71  H RECURSIVE.** q
118c0 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d  uery of the form
118d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72  :.**.**   <recur
118e0 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28  sive-table> AS (
118f0 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e  <setup-query> UN
11900 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72  ION [ALL] <recur
11910 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20  sive-query>).** 
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
11940 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20  ____/           
11950 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
11960 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __/.**          
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20   p->pPrior      
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  p.**.**.** There
119b0 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
119c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
119d0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
119e0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
119f0 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73  use.** of recurs
11a00 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65  ive-query, marke
11a10 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69  d with the SrcLi
11a20 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63  st->a[].fg.isRec
11a30 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a  ursive flag..**.
11a40 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65  ** The setup-que
11a50 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  ry runs once to 
11a60 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74  generate an init
11a70 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20  ial set of rows 
11a80 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20  that go.** into 
11a90 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  a Queue table.  
11aa0 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74  Rows are extract
11ab0 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75  ed from the Queu
11ac0 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a  e table one by.*
11ad0 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77  * one.  Each row
11ae0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
11af0 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20  Queue is output 
11b00 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20  to pDest.  Then 
11b10 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78  the single.** ex
11b20 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77  tracted row (now
11b30 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74   in the iCurrent
11b40 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20   table) becomes 
11b50 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
11b60 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d  he.** recursive-
11b70 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75  table for a recu
11b80 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e  rsive-query run.
11b90 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20    The output of 
11ba0 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75  the recursive-qu
11bb0 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ery.** is added 
11bc0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75  back into the Qu
11bd0 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  eue table.  Then
11be0 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20   another row is 
11bf0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
11c00 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ueue.** and the 
11c10 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e  iteration contin
11c20 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75  ues until the Qu
11c30 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  eue table is emp
11c40 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
11c50 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
11c60 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
11c70 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63  N then no duplic
11c80 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65  ate rows are eve
11c90 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  r.** inserted in
11ca0 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
11cb0 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e  le.  The iDistin
11cc0 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61  ct table keeps a
11cd0 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77   copy of all row
11ce0 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65  s.** that have e
11cf0 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ver been inserte
11d00 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64  d into Queue and
11d10 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74   causes duplicat
11d20 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63  es to be.** disc
11d30 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f  arded.  If the o
11d40 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
11d50 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69   ALL, then dupli
11d60 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  cates are allowe
11d70 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  d..** .** If the
11d80 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52   query has an OR
11d90 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74  DER BY, then ent
11da0 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75  ries in the Queu
11db0 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74  e table are kept
11dc0 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
11dd0 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69  order and the fi
11de0 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74  rst entry is ext
11df0 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20  racted for each 
11e00 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a  cycle.  Without.
11e10 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  ** an ORDER BY, 
11e20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
11e30 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a  is just a FIFO..
11e40 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54  **.** If a LIMIT
11e50 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69   clause is provi
11e60 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74  ded, then the it
11e70 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66  eration stops af
11e80 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a  ter LIMIT rows.*
11e90 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70  * have been outp
11ea0 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20  ut to pDest.  A 
11eb0 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65  LIMIT of zero me
11ec0 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f  ans to output no
11ed0 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e   rows and a.** n
11ee0 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65  egative LIMIT me
11ef0 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c  ans to output al
11f00 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72  l rows.  If ther
11f10 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46  e is also an OFF
11f20 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69  SET clause.** wi
11f30 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  th a positive va
11f40 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  lue, then the fi
11f50 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75  rst OFFSET outpu
11f60 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64  ts are discarded
11f70 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20   rather.** than 
11f80 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44  being sent to pD
11f90 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20  est.  The LIMIT 
11fa0 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62  count does not b
11fb0 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72  egin until after
11fc0 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20   OFFSET.** rows 
11fd0 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
11fe0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
11ff0 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65  d generateWithRe
12000 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20  cursiveQuery(.  
12010 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
12020 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
12030 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
12040 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
12050 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72      /* The recur
12060 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62  sive SELECT to b
12070 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12080 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12090 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
120a0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
120b0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  lts */.){.  SrcL
120c0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
120d0 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
120e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
120f0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75  the recursive qu
12100 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ery */.  int nCo
12110 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
12120 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Expr;  /* Number
12130 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
12140 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62  he recursive tab
12150 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  le */.  Vdbe *v 
12160 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
12170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
12180 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
12190 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
121a0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
121b0 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69  pSetup = p->pPri
121c0 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74  or;   /* The set
121d0 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  up query */.  in
121e0 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
121f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12200 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  op of the loop *
12210 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
12220 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20  , addrBreak;    
12230 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e    /* CONTINUE an
12240 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65  d BREAK addresse
12250 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72  s */.  int iCurr
12260 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
12270 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72       /* The Curr
12280 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
12290 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20  nt regCurrent;  
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122b0 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
122c0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
122d0 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20  /.  int iQueue; 
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74    /* The Queue t
12300 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  able */.  int iD
12310 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20  istinct = 0;    
12320 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e          /* To en
12330 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75  sure unique resu
12340 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a  lts if UNION */.
12350 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52    int eDest = SR
12360 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20  T_Fifo;         
12370 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20  /* How to write 
12380 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65  to Queue */.  Se
12390 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65  lectDest destQue
123a0 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ue;         /* S
123b0 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74  electDest target
123c0 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74  ting the Queue t
123d0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
12400 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
12410 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
12420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12430 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45  sult code */.  E
12440 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
12450 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
12460 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
12470 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
12480 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
12490 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
124a0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
124b0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
124c0 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20  it, regOffset;  
124d0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
124e0 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61   used by LIMIT a
124f0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20  nd OFFSET */..  
12500 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72  /* Obtain author
12510 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20  ization to do a 
12520 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
12530 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
12540 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
12550 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  , SQLITE_RECURSI
12560 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  VE, 0, 0, 0) ) r
12570 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f  eturn;..  /* Pro
12580 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61  cess the LIMIT a
12590 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
125a0 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74  s, if they exist
125b0 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20   */.  addrBreak 
125c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
125d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e  eLabel(v);.  p->
125e0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30  nSelectRow = 320
125f0 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20  ;  /* 4 billion 
12600 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  rows */.  comput
12610 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12620 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42  pParse, p, addrB
12630 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20  reak);.  pLimit 
12640 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70  = p->pLimit;.  p
12650 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
12660 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20  set;.  regLimit 
12670 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72  = p->iLimit;.  r
12680 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  egOffset = p->iO
12690 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d  ffset;.  p->pLim
126a0 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20  it = p->pOffset 
126b0 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  = 0;.  p->iLimit
126c0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20   = p->iOffset = 
126d0 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  0;.  pOrderBy = 
126e0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
126f0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75  /* Locate the cu
12700 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
12710 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
12720 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41   */.  for(i=0; A
12730 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53  LWAYS(i<pSrc->nS
12740 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rc); i++){.    i
12750 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67  f( pSrc->a[i].fg
12760 2e 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a  .isRecursive ){.
12770 20 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d        iCurrent =
12780 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72   pSrc->a[i].iCur
12790 73 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  sor;.      break
127a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
127b0 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
127c0 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51  rs numbers for Q
127d0 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63  ueue and Distinc
127e0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e  t.  The cursor n
127f0 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74  umber for.  ** t
12800 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c  he Distinct tabl
12810 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  e must be exactl
12820 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68  y one greater th
12830 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65  an Queue in orde
12840 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53  r.  ** for the S
12850 52 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20  RT_DistFifo and 
12860 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65  SRT_DistQueue de
12870 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f  stinations to wo
12880 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20  rk. */.  iQueue 
12890 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
128a0 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
128b0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65  K_UNION ){.    e
128c0 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
128d0 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ? SRT_DistQueue 
128e0 3a 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a  : SRT_DistFifo;.
128f0 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20      iDistinct = 
12900 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
12910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65    }else{.    eDe
12920 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
12930 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f  SRT_Queue : SRT_
12940 46 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Fifo;.  }.  sqli
12950 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
12960 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44  t(&destQueue, eD
12970 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  est, iQueue);.. 
12980 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72   /* Allocate cur
12990 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74  sors for Current
129a0 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73  , Queue, and Dis
129b0 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43  tinct. */.  regC
129c0 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73  urrent = ++pPars
129d0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74  e->nMem;.  sqlit
129e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
129f0 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69  OP_OpenPseudo, i
12a00 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72  Current, regCurr
12a10 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66  ent, nCol);.  if
12a20 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
12a30 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
12a40 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  nfo = multiSelec
12a50 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
12a60 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
12a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12a80 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
12a90 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
12aa0 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
12ab0 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
12ad0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
12ae0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
12af0 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72  destQueue.pOrder
12b00 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
12b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
12b20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12b30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
12b40 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29  l, iQueue, nCol)
12b50 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d  ;.  }.  VdbeComm
12b60 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74  ent((v, "Queue t
12b70 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69  able"));.  if( i
12b80 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
12b90 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
12ba0 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  0] = sqlite3Vdbe
12bb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
12bc0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73  nEphemeral, iDis
12bd0 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70  tinct, 0);.    p
12be0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
12bf0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
12c00 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68    }..  /* Detach
12c10 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
12c20 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f  ause from the co
12c30 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f  mpound SELECT */
12c40 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d  .  p->pOrderBy =
12c50 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20   0;..  /* Store 
12c60 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
12c70 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69  he setup-query i
12c80 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53  n Queue. */.  pS
12c90 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  etup->pNext = 0;
12ca0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
12cb0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12cc0 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65  etup, &destQueue
12cd0 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  );.  pSetup->pNe
12ce0 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63  xt = p;.  if( rc
12cf0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72   ) goto end_of_r
12d00 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a  ecursive_query;.
12d10 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  /* Find the n
12d20 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51  ext row in the Q
12d30 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20  ueue and output 
12d40 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64  that row */.  ad
12d50 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
12d60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12d70 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20  Rewind, iQueue, 
12d80 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
12d90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
12da0 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
12db0 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75  next row in Queu
12dc0 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e  e over to Curren
12dd0 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  t */.  sqlite3Vd
12de0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
12df0 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74  ullRow, iCurrent
12e00 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63  ); /* To reset c
12e10 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20  olumn cache */. 
12e20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
12e30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12e40 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
12e50 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  umn, iQueue, pOr
12e60 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
12e70 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
12e80 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
12e90 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12ea0 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75  P_RowData, iQueu
12eb0 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  e, regCurrent);.
12ec0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
12ed0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
12ee0 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a  lete, iQueue);..
12ef0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
12f00 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
12f10 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43  rrent */.  addrC
12f20 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
12f30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
12f40 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72   codeOffset(v, r
12f50 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  egOffset, addrCo
12f60 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  nt);.  selectInn
12f70 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
12f80 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75  , p->pEList, iCu
12f90 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20  rrent,.      0, 
12fa0 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f  0, pDest, addrCo
12fb0 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  nt, addrBreak);.
12fc0 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29    if( regLimit )
12fd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12fe0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
12ff0 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c  crJumpZero, regL
13000 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29  imit, addrBreak)
13010 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
13020 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
13030 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
13040 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
13050 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  );..  /* Execute
13060 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53   the recursive S
13070 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65  ELECT taking the
13080 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
13090 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74  urrent as.  ** t
130a0 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
130b0 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
130c0 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  . Store the resu
130d0 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  lts in the Queue
130e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
130f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
13100 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73  gregate ){.    s
13110 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13120 50 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76  Parse, "recursiv
13130 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  e aggregate quer
13140 69 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  ies not supporte
13150 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d");.  }else{.  
13160 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
13170 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
13180 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
13190 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61  estQueue);.    a
131a0 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72  ssert( p->pPrior
131b0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50  ==0 );.    p->pP
131c0 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20  rior = pSetup;. 
131d0 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75   }..  /* Keep ru
131e0 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
131f0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
13200 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
13210 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
13220 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
13230 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
13240 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b  bel(v, addrBreak
13250 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72  );..end_of_recur
13260 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71  sive_query:.  sq
13270 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
13280 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
13290 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
132a0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
132b0 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69  rderBy;.  p->pLi
132c0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
132d0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
132e0 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  fset;.  return;.
132f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
13300 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a  TE_OMIT_CTE */..
13310 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
13320 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ences */.static 
13330 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  int multiSelectO
13340 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
13350 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13360 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13370 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
13380 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
13390 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
133a0 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
133b0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
133c0 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
133d0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
133e0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
133f0 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.);../*.** 
13400 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69  Handle the speci
13410 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d  al case of a com
13420 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
13430 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f  t originates fro
13440 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c  m a.** VALUES cl
13450 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69  ause.  By handli
13460 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65  ng this as a spe
13470 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76  cial case, we av
13480 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75  oid deep.** recu
13490 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20  rsion, and thus 
134a0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65  do not need to e
134b0 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54  nforce the SQLIT
134c0 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
134d0 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20  _SELECT.** on a 
134e0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a  VALUES clause..*
134f0 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65  *.** Because the
13500 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f   Select object o
13510 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61  riginates from a
13520 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a   VALUES clause:.
13530 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20  **   (1) It has 
13540 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53  no LIMIT or OFFS
13550 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20  ET.**   (2) All 
13560 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20  terms are UNION 
13570 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  ALL.**   (3) The
13580 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
13590 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74  Y clause.*/.stat
135a0 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
135b0 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73  ctValues(.  Pars
135c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
135d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
135e0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
135f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13600 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
13610 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
13620 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
13630 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
13640 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
13650 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
13660 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c  ults */.){.  Sel
13670 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69  ect *pPrior;.  i
13680 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69  nt nRow = 1;.  i
13690 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73  nt rc = 0;.  ass
136a0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
136b0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
136c0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73   );.  do{.    as
136d0 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
136e0 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b  s & SF_Values );
136f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13700 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70  op==TK_ALL || (p
13710 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
13720 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29  && p->pPrior==0)
13730 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13740 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a  p->pLimit==0 );.
13750 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13760 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
13770 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78   assert( p->pNex
13780 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  t==0 || p->pELis
13790 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65  t->nExpr==p->pNe
137a0 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  xt->pEList->nExp
137b0 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  r );.    if( p->
137c0 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61  pPrior==0 ) brea
137d0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  k;.    assert( p
137e0 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
137f0 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  =p );.    p = p-
13800 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f  >pPrior;.    nRo
13810 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29  w++;.  }while(1)
13820 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
13830 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e      pPrior = p->
13840 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
13850 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72  Prior = 0;.    r
13860 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
13870 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65  t(pParse, p, pDe
13880 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  st);.    p->pPri
13890 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
138a0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
138b0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
138c0 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70  ow = nRow;.    p
138d0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
138e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
138f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13900 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
13910 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
13920 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
13930 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
13940 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
13950 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
13960 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
13970 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
13980 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
13990 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
139a0 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
139b0 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
139c0 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
139d0 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
139e0 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
139f0 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
13a00 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
13a10 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
13a20 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
13a30 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
13a40 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
13a50 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
13a60 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
13a70 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
13a80 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
13a90 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
13aa0 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
13ab0 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
13ac0 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
13ad0 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
13ae0 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
13af0 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
13b00 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
13b10 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
13b20 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
13b30 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
13b40 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
13b50 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
13b60 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
13b70 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
13b80 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
13b90 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
13ba0 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
13bb0 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
13bd0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13be0 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
13bf0 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
13c00 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
13c10 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
13c20 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
13c30 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
13c40 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
13c50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13c60 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
13c70 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
13c80 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
13c90 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
13ca0 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
13cb0 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
13cc0 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
13cd0 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
13ce0 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
13cf0 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
13d00 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
13d10 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
13d20 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
13d30 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
13d40 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
13d50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
13d60 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
13d70 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13d80 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13d90 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
13da0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
13db0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
13dc0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
13dd0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
13de0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
13df0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
13e00 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
13e10 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
13e20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13e30 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
13e40 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
13e50 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
13e60 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
13e70 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
13e80 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
13e90 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
13ea0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
13eb0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
13ec0 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
13ed0 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
13ee0 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
13ef0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
13f00 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
13f10 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
13f20 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
13f30 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
13f40 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
13f50 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
13f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
13f70 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13f80 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
13f90 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
13fa0 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b    int iSub1 = 0;
13fb0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
13fc0 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
13fd0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
13fe0 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ub2 = 0;        
13ff0 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
14000 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
14010 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
14020 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
14030 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
14040 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
14050 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
14060 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
14070 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
14080 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
14090 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
140a0 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
140b0 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
140c0 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
140d0 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
140e0 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
140f0 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
14100 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
14110 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
14120 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
14130 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
14140 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14150 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
14160 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d  ->db;.  pPrior =
14170 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65   p->pPrior;.  de
14180 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
14190 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
141a0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
141b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
141c0 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
141d0 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
141e0 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
141f0 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
14200 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
14210 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
14220 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
14230 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
14240 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
14250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
14260 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
14270 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
14280 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
14290 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
142a0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
142b0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
142c0 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
142d0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
142e0 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
142f0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
14300 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
14310 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
14320 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
14330 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
14340 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
14350 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
14360 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
14370 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
14380 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
14390 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
143a0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
143b0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
143c0 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
143d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
143e0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
143f0 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
14400 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
14410 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20  .    dest.eDest 
14420 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  = SRT_Table;.  }
14430 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68  ..  /* Special h
14440 61 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f  andling for a co
14450 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
14460 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73  at originates as
14470 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
14480 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14490 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75  selFlags & SF_Mu
144a0 6c 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  ltiValue ){.    
144b0 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
144c0 56 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70  Values(pParse, p
144d0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f  , &dest);.    go
144e0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
144f0 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  end;.  }..  /* M
14500 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
14510 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
14520 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
14530 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
14540 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
14550 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
14560 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
14570 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
14580 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
14590 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
145a0 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69  ist->nExpr==pPri
145b0 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  or->pEList->nExp
145c0 72 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  r );..#ifndef SQ
145d0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
145e0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
145f0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
14600 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69  {.    generateWi
14610 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
14620 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
14630 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  t);.  }else.#end
14640 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e  if..  /* Compoun
14650 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68  d SELECTs that h
14660 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ave an ORDER BY 
14670 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c  clause are handl
14680 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20  ed separately.. 
14690 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72   */.  if( p->pOr
146a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74  derBy ){.    ret
146b0 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  urn multiSelectO
146c0 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70  rderBy(pParse, p
146d0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73  , pDest);.  }els
146e0 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  e..  /* Generate
146f0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
14700 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
14710 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
14720 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
14730 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
14740 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
14750 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
14760 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b       int nLimit;
14770 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14780 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
14790 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
147a0 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  iLimit = p->iLim
147b0 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  it;.      pPrior
147c0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  ->iOffset = p->i
147d0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50  Offset;.      pP
147e0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rior->pLimit = p
147f0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
14800 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20  pPrior->pOffset 
14810 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
14820 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
14830 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
14840 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
14850 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
14860 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
14870 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64  arse, pPrior, &d
14880 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  est);.      p->p
14890 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
148a0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
148b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
148c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
148d0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
148e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
148f0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
14900 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
14910 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
14920 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
14930 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65  = pPrior->iOffse
14940 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  t;.      if( p->
14950 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
14960 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
14970 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14980 5f 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69  _IfNot, p->iLimi
14990 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
149a0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  (v);.        Vdb
149b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75  eComment((v, "Ju
149c0 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49  mp ahead if LIMI
149d0 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20  T reached"));.  
149e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66        if( p->iOf
149f0 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  fset ){.        
14a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14a10 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
14a20 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
14a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a40 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d     p->iLimit, p-
14a50 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69  >iOffset+1, p->i
14a60 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
14a70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14a80 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
14a90 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
14aa0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
14ab0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14ac0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
14ad0 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
14ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14af0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14b00 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
14b10 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
14b20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
14b30 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  or;.      p->nSe
14b40 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
14b50 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
14b60 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
14b70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
14b80 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
14b90 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26  >pLimit.       &
14ba0 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
14bb0 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70  nteger(pPrior->p
14bc0 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a  Limit, &nLimit).
14bd0 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74         && nLimit
14be0 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  >0 && p->nSelect
14bf0 52 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67  Row > sqlite3Log
14c00 45 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29  Est((u64)nLimit)
14c10 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
14c20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
14c30 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
14c40 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20  ((u64)nLimit);. 
14c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14c60 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
14c70 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
14c80 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
14c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14ca0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
14cb0 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
14cc0 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
14cd0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
14ce0 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
14cf0 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
14d00 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
14d10 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
14d20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
14d30 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
14d40 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
14d50 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
14d60 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
14d70 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
14d80 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
14d90 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
14da0 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
14db0 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
14dc0 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
14dd0 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
14de0 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
14df0 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
14e00 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
14e10 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
14e20 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
14e30 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14e40 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
14e50 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
14e60 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
14e70 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
14e80 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
14e90 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
14ea0 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
14eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
14ec0 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
14ed0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
14ee0 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
14ef0 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
14f00 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
14f10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14f20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
14f30 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
14f40 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
14f50 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
14f60 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14f70 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
14f80 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
14f90 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
14fa0 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
14fb0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
14fc0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
14fd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14fe0 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
14ff0 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
15000 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
15010 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
15020 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
15030 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
15040 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
15050 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
15060 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15070 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
15080 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
15090 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
150a0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
150b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
150c0 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
150d0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
150e0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
150f0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
15100 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
15110 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
15120 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
15130 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
15140 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
15150 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
15160 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15170 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
15180 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
15190 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
151a0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
151b0 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
151c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
151d0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
151e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
151f0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
15200 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
15210 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
15220 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
15230 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
15240 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
15250 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
15260 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15270 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
15280 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
15290 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
152a0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
152b0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
152c0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
152d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
152e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
152f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
15300 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
15310 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
15320 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
15330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15340 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
15350 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
15360 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
15370 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
15380 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
15390 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
153a0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
153b0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
153c0 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
153d0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
153e0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
153f0 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
15400 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
15410 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
15420 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
15430 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
15440 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
15450 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
15460 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
15470 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
15480 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
15490 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
154a0 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
154b0 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
154c0 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
154d0 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
154e0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
154f0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
15500 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
15510 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
15520 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
15530 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
15540 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
15550 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
15560 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
15570 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
15580 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
15590 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
155a0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
155b0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
155c0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  N ){.        p->
155d0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
155e0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
155f0 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
15600 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
15610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15620 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
15630 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
15640 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
15650 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
15660 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
15670 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
15680 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
15690 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
156a0 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e  0;..      /* Con
156b0 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e  vert the data in
156c0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
156d0 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76  able into whatev
156e0 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  er form.      **
156f0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
15700 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
15710 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
15720 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d  sert( unionTab==
15730 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20  dest.iSDParm || 
15740 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
15750 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28  rOp );.      if(
15760 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
15770 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  orOp ){.        
15780 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
15790 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
157a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
157b0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  List );.        
157c0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
157d0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
157e0 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20  ;.        iCont 
157f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15800 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
15810 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
15820 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
15830 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
15840 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15850 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
15860 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
15870 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
15880 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
15890 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
158a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
158b0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
158c0 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
158d0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
158e0 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20  t, unionTab,.   
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
15910 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
15920 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15930 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
15940 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
15950 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15960 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
15970 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74  t, unionTab, iSt
15980 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
15990 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
159a0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
159b0 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
159c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
159d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
159e0 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
159f0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
15a00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15a10 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
15a20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
15a30 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
15a40 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
15a50 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
15a60 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
15a70 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
15a80 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
15a90 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
15aa0 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
15ab0 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
15ac0 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
15ad0 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
15ae0 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
15af0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
15b00 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
15b10 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
15b20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
15b30 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
15b40 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
15b50 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
15b60 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
15b70 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
15b80 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
15b90 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
15ba0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
15bb0 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
15bc0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15bd0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
15be0 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
15bf0 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
15c00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15c10 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
15c20 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
15c30 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
15c40 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
15c50 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
15c60 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
15c70 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64  addr;.      find
15c80 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
15c90 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
15ca0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
15cb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
15cc0 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
15cd0 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
15ce0 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
15cf0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
15d00 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
15d10 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
15d20 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
15d30 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
15d40 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
15d50 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
15d60 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
15d70 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
15d80 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
15d90 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
15da0 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
15db0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
15dc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
15dd0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
15de0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15df0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15e00 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
15e10 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
15e20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15e30 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
15e40 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
15e50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15e60 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
15e70 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
15e80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15e90 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
15ea0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
15eb0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
15ec0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
15ed0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
15ee0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
15ef0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
15f00 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
15f10 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
15f20 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
15f30 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
15f40 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
15f50 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
15f60 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
15f70 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
15f80 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
15f90 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
15fa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
15fb0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
15fc0 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
15fd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15fe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15ff0 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
16000 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
16010 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
16020 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
16030 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
16040 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
16050 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
16060 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
16070 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
16080 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
16090 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
160a0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
160b0 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
160c0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
160d0 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
160e0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
160f0 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
16100 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
16110 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
16120 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
16130 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
16140 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
16150 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
16160 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16170 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43  bel(v);.      iC
16180 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
16190 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
161a0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
161b0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
161c0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
161d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
161e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
161f0 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61  ind, tab1, iBrea
16200 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
16210 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  (v);.      r1 = 
16220 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16230 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
16240 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
16250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16260 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c  P_RowData, tab1,
16270 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
16280 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
16290 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c  (v, OP_NotFound,
162a0 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31   tab2, iCont, r1
162b0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
162c0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
162d0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
162e0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
162f0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
16300 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
16310 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
16320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16330 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
16340 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
16350 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
16360 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
16370 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
16380 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16390 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
163a0 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b  , tab1, iStart);
163b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
163c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
163d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
163e0 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  v, iBreak);.    
163f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16400 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
16410 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
16420 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16430 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
16440 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  tab1, 0);.      
16450 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
16460 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  ..  explainCompo
16470 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  site(pParse, p->
16480 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  op, iSub1, iSub2
16490 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  , p->op!=TK_ALL)
164a0 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
164b0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
164c0 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a  ces used by .  *
164d0 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  * temporary tabl
164e0 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70  es needed to imp
164f0 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f  lement the compo
16500 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a  und select..  **
16510 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79 49   Attach the KeyI
16520 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f  nfo structure to
16530 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74   all temporary t
16540 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
16550 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73   This section is
16560 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67 68   run by the righ
16570 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
16580 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20  atement only..  
16590 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
165a0 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74  ents to the left
165b0 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69   always skip thi
165c0 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69 67  s part.  The rig
165d0 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c  ht-most.  ** SEL
165e0 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73  ECT might also s
165f0 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69 66  kip this part if
16600 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52   it has no ORDER
16610 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20   BY clause and. 
16620 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c   ** no temp tabl
16630 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 2e  es are required.
16640 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
16650 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
16660 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20  sEphemeral ){.  
16670 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16690 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
166a0 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
166b0 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20  pKeyInfo;       
166c0 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
166d0 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
166e0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
166f0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f  .    Select *pLo
16700 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
16710 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
16720 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54  g through SELECT
16730 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
16740 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43     CollSeq **apC
16750 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
16760 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
16770 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f  through pKeyInfo
16780 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20  ->aColl[] */.   
16790 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
167b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
167c0 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65  mns in result se
167d0 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  t */..    assert
167e0 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b  ( p->pNext==0 );
167f0 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70  .    nCol = p->p
16800 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
16810 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
16820 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
16830 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20  (db, nCol, 1);. 
16840 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f     if( !pKeyInfo
16850 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
16860 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
16870 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
16880 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
16890 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
168a0 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
168b0 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
168c0 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
168d0 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
168e0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
168f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
16900 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
16910 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
16920 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62      *apColl = db
16930 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
16940 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
16950 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
16960 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
16970 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
16980 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
16990 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
169a0 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
169b0 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20  drOpenEphm[i];. 
169c0 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
169d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
169e0 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
169f0 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
16a00 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
16a10 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
16a20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
16a30 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
16a40 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
16a50 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
16a60 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
16a70 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
16a80 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20  drOpenEphm[1]<0 
16a90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
16aa0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
16ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16ac0 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
16ad0 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
16ae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16af0 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
16b00 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
16b10 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
16b20 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
16b40 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
16b50 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
16b60 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
16b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16b80 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
16b90 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
16ba0 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
16bb0 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74  ect_end:.  pDest
16bc0 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  ->iSdst = dest.i
16bd0 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e  Sdst;.  pDest->n
16be0 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73  Sdst = dest.nSds
16bf0 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  t;.  sqlite3Sele
16c00 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  ctDelete(db, pDe
16c10 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lete);.  return 
16c20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
16c30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
16c40 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
16c50 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73  /*.** Error mess
16c60 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f  age for when two
16c70 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f   or more terms o
16c80 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
16c90 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72 65  ect have differe
16ca0 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c  nt.** size resul
16cb0 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  t sets..*/.void 
16cc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f  sqlite3SelectWro
16cd0 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28  ngNumTermsError(
16ce0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
16cf0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
16d00 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
16d10 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20  F_Values ){.    
16d20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16d30 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
16d40 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
16d50 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
16d60 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73   terms");.  }els
16d70 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  e{.    sqlite3Er
16d80 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
16d90 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
16da0 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
16db0 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20   %s".      " do 
16dc0 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
16dd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
16de0 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
16df0 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
16e00 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
16e10 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
16e20 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
16e30 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
16e40 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
16e50 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
16e60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
16e70 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
16e80 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
16e90 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65  n->iSdst.  There
16ea0 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64   are.** pIn->nSd
16eb0 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  st columns to be
16ec0 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
16ed0 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
16ee0 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
16ef0 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
16f00 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
16f10 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
16f20 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
16f30 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
16f40 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
16f50 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
16f60 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
16f70 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
16f80 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
16f90 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
16fa0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
16fb0 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
16fc0 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
16fd0 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
16fe0 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
16ff0 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
17000 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
17010 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
17020 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
17030 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
17040 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
17050 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
17060 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
17070 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
17080 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
17090 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
170a0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
170b0 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
170c0 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
170d0 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
170e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
170f0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
17100 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
17110 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
17120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17130 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
17140 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
17150 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
17160 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
17170 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
17180 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
17190 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
171a0 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
171b0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
171c0 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
171d0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
171e0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
171f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
17200 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
17210 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
17220 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
17230 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
17240 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
17250 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
17260 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
17270 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
17280 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
172a0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65 20  Jump here if we 
172b0 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f  hit the LIMIT */
172c0 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
172d0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
172e0 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a   int iContinue;.
172f0 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61    int addr;..  a
17300 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
17310 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
17320 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73  .  iContinue = s
17330 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17340 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75  bel(v);..  /* Su
17350 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
17360 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43  s for UNION, EXC
17370 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45  EPT, and INTERSE
17380 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  CT .  */.  if( r
17390 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e  egPrev ){.    in
173a0 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
173b0 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69      addr1 = sqli
173c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
173d0 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
173e0 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ev); VdbeCoverag
173f0 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20  e(v);.    addr2 
17400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17410 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
17420 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  e, pIn->iSdst, r
17430 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
17440 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Sdst,.          
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17460 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
17470 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
17480 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
17490 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
174a0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
174b0 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20  _Jump, addr2+2, 
174c0 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32  iContinue, addr2
174d0 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +2); VdbeCoverag
174e0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
174f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17500 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
17510 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17520 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e  , OP_Copy, pIn->
17530 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
17540 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b  , pIn->nSdst-1);
17550 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17560 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
17570 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
17580 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
17590 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
175a0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
175b0 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
175c0 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
175d0 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
175e0 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
175f0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
17600 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
17610 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
17620 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e);..  assert( p
17630 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
17640 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73  _Exists );.  ass
17650 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
17660 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t!=SRT_Table );.
17670 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d    switch( pDest-
17680 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a  >eDest ){.    /*
17690 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
176a0 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
176b0 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
176c0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
176d0 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
176e0 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
176f0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
17700 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
17710 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
17720 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
17730 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17740 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
17750 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
17760 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17770 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  st, r1);.      s
17780 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17790 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
177a0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
177b0 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
177c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
177d0 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73   OP_Insert, pDes
177e0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20  t->iSDParm, r1, 
177f0 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
17800 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
17810 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
17820 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
17830 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
17840 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
17850 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17860 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17870 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
17880 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
17890 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
178a0 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
178b0 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
178c0 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
178d0 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
178e0 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  )"..    */.    c
178f0 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
17900 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
17910 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e     testcase( pIn
17920 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20  ->nSdst>1 );.   
17930 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
17940 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17950 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17960 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
17970 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
17980 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17990 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  dst, .          
179a0 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53  r1, pDest->zAffS
179b0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
179c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
179d0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
179e0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
179f0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
17a00 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
17a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
17a20 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  nt(v, OP_IdxInse
17a30 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
17a40 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20  rm, r1,.        
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70     pIn->iSdst, p
17a70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17a80 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
17a90 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
17aa0 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
17ab0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17ac0 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
17ad0 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
17ae0 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
17af0 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
17b00 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
17b10 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
17b20 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
17b30 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
17b40 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
17b50 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
17b60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
17b70 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
17b80 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73  ssert( pIn->nSds
17b90 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e  t==1 || pParse->
17ba0 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63  nErr>0 );  testc
17bb0 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21  ase( pIn->nSdst!
17bc0 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
17bd0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
17be0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17bf0 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  st, pDest->iSDPa
17c00 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a  rm, 1);.      /*
17c10 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
17c20 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
17c30 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
17c40 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  us */.      brea
17c50 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
17c60 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
17c70 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
17c80 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  */..    /* The r
17c90 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65  esults are store
17ca0 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20  d in a sequence 
17cb0 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20 20  of registers.   
17cc0 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
17cd0 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54  pDest->iSdst.  T
17ce0 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  hen the co-routi
17cf0 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a  ne yields..    *
17d00 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  /.    case SRT_C
17d10 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20  oroutine: {.    
17d20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
17d30 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
17d40 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20   pDest->iSdst = 
17d50 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
17d60 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
17d70 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20  >nSdst);.       
17d80 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
17d90 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20  pIn->nSdst;.    
17da0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
17db0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
17dc0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
17dd0 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
17de0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17e00 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
17e10 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
17e20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17e30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17e40 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
17e50 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
17e60 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
17e70 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
17e80 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
17e90 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
17ea0 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
17eb0 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
17ec0 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
17ed0 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
17ee0 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
17ef0 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
17f00 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
17f10 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
17f20 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
17f30 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
17f40 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
17f50 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
17f60 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
17f70 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
17f80 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
17f90 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
17fa0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
17fb0 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
17fc0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
17fd0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
17fe0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
17ff0 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
18000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18010 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
18020 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
18030 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
18040 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
18050 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
18060 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
18070 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
18080 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18090 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
180a0 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
180b0 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
180c0 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
180d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
180e0 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
180f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18100 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65  v, OP_DecrJumpZe
18110 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
18120 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
18130 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20  rage(v);.  }..  
18140 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
18150 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
18160 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
18170 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18180 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
18190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
181a0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
181b0 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
181c0 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
181d0 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
181e0 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
181f0 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
18200 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
18210 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
18220 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
18230 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
18240 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
18250 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
18260 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
18270 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
18280 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
18290 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
182a0 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
182b0 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
182c0 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
182d0 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
182e0 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
182f0 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
18300 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
18310 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
18320 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
18330 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
18340 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
18350 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
18360 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
18370 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
18380 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
18390 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
183a0 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
183b0 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
183c0 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
183d0 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
183e0 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
183f0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
18400 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
18410 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
18420 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
18430 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
18440 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
18450 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
18460 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
18470 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
18480 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
18490 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
184a0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
184b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
184c0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
184d0 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
184e0 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
184f0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
18500 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
18510 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
18520 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
18530 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
18550 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
18560 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
18570 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
18580 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
18590 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
185a0 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
185b0 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
185c0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
185d0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
185e0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
185f0 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
18600 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
18610 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
18620 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
18630 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
18640 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
18650 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
18660 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
18670 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
18680 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
18690 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
186a0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
186b0 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
186c0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
186d0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
186e0 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
186f0 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
18700 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
18710 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
18720 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
18730 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
18740 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
18750 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
18760 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
18770 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
18780 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
18790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
187a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
187b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
187c0 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
187d0 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
187e0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
187f0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
18800 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
18810 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
18820 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
18830 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
18840 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
18850 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
18860 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
18870 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
18880 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
18890 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
188a0 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
188b0 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
188c0 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
188d0 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
188e0 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
188f0 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
18900 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18910 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
18920 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
18930 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
18940 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
18950 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
18960 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
18970 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
18980 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
18990 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
189a0 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
189b0 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
189c0 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
189d0 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
189e0 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
189f0 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
18a00 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
18a10 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
18a20 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
18a30 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
18a40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
18a50 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
18a60 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
18a70 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
18a80 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
18a90 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
18aa0 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
18ab0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
18ac0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
18ad0 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
18ae0 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
18af0 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
18b00 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
18b10 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
18b20 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
18b30 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
18b40 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
18b50 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
18b60 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
18b70 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
18b80 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
18b90 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
18ba0 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
18bb0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
18bc0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
18bd0 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
18be0 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
18bf0 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
18c00 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
18c10 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
18c20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
18c30 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
18c40 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
18c50 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
18c60 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
18c70 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
18c80 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
18c90 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
18ca0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
18cb0 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
18cc0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
18cd0 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
18ce0 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
18cf0 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
18d00 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
18d10 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
18d20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
18d30 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
18d40 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
18d50 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
18d60 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
18d70 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
18d80 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
18d90 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
18da0 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
18db0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
18dc0 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
18dd0 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
18de0 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
18df0 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
18e00 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
18e10 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
18e20 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
18e30 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
18e40 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
18e50 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
18e60 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
18e70 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
18e80 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
18e90 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
18ea0 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
18eb0 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
18ec0 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
18ed0 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
18ee0 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
18ef0 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
18f00 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
18f10 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
18f20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
18f30 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
18f40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
18f50 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
18f60 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
18f70 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
18f80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
18f90 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18fa0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
18fb0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
18fc0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
18fd0 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
18fe0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
18ff0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
19000 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
19010 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
19020 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
19030 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
19040 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
19050 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
19060 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
19070 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
19080 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
19090 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
190a0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
190b0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
190c0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
190d0 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
190e0 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
190f0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
19100 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
19110 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
19120 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
19130 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
19140 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
19150 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
19160 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
19170 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
19180 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
19190 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
191a0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
191b0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
191c0 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  or select-B coro
191d0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
191e0 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20  ddrSelectA;     
191f0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19200 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f  he select-A coro
19210 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19220 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20  ddrSelectB;     
19230 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19240 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  he select-B coro
19250 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
19260 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  egOutA;         
19270 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
19280 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
19290 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65  put-A subroutine
192a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
192b0 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  B;          /* A
192c0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
192d0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42  for the output-B
192e0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
192f0 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20   int addrOutA;  
19300 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19310 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
19320 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
19330 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d    int addrOutB =
19340 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65   0;     /* Addre
19350 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
19360 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
19370 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b  .  int addrEofA;
19380 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
19390 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
193a0 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-A-exhausted su
193b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
193c0 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20  t addrEofA_noB; 
193d0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65      /* Alternate
193e0 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20 69   addrEofA if B i
193f0 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
19400 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
19410 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
19420 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
19430 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20  ect-B-exhausted 
19440 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19450 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20  int addrAltB;   
19460 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
19470 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62 72   of the A<B subr
19480 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19490 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20 20  addrAeqB;       
194a0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
194b0 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74  the A==B subrout
194c0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
194d0 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAgtB;         /
194e0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
194f0 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A>B subroutine 
19500 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
19510 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tA;        /* Li
19520 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
19530 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
19540 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20  nt regLimitB;   
19550 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65       /* Limit re
19560 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
19570 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  t-A */.  int reg
19580 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  Prev;          /
19590 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67  * A range of reg
195a0 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70  isters to hold p
195b0 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a  revious output *
195c0 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d  /.  int savedLim
195d0 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76  it;       /* Sav
195e0 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
195f0 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73  Limit */.  int s
19600 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20  avedOffset;     
19610 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
19620 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f  of p->iOffset */
19630 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72  .  int labelCmpr
19640 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65  ;        /* Labe
19650 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  l for the start 
19660 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67  of the merge alg
19670 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20  orithm */.  int 
19680 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20  labelEnd;       
19690 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
196a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76  he end of the ov
196b0 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d  erall SELECT stm
196c0 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  t */.  int addr1
196d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
196e0 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  Jump instruction
196f0 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61 72  s that get retar
19700 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  getted */.  int 
19710 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
19720 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41    /* One of TK_A
19730 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b  LL, TK_UNION, TK
19740 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45  _EXCEPT, TK_INTE
19750 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e  RSECT */.  KeyIn
19760 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b  fo *pKeyDup = 0;
19770 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69   /* Comparison i
19780 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64  nformation for d
19790 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
197a0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
197b0 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43  KeyMerge;   /* C
197c0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
197d0 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e  ation for mergin
197e0 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69  g rows */.  sqli
197f0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
19800 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
19810 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
19820 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
19830 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
19840 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
19850 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20  int nOrderBy;   
19860 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19870 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
19880 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
19890 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75  */.  int *aPermu
198a0 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  te;        /* Ma
198b0 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52  pping from ORDER
198c0 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73   BY terms to res
198d0 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
198e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
198f0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
19900 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20   int iSub1;     
19910 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
19920 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
19930 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
19940 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b2;            /
19950 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
19960 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
19970 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
19980 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30  ( p->pOrderBy!=0
19990 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
199a0 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22  eyDup==0 ); /* "
199b0 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65  Managed" code ne
199c0 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65  eds this.  Ticke
199d0 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62  t #3382. */.  db
199e0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
199f0 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
19a00 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  be;.  assert( v!
19a10 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41  =0 );       /* A
19a20 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68  lready thrown th
19a30 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20  e error if VDBE 
19a40 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a  alloc failed */.
19a50 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c    labelEnd = sql
19a60 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
19a70 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70  l(v);.  labelCmp
19a80 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  r = sqlite3VdbeM
19a90 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20  akeLabel(v);... 
19aa0 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65   /* Patch up the
19ab0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19ac0 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e  .  */.  op = p->
19ad0 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d  op;  .  pPrior =
19ae0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
19af0 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f  sert( pPrior->pO
19b00 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70  rderBy==0 );.  p
19b10 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
19b20 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28  derBy;.  assert(
19b30 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e   pOrderBy );.  n
19b40 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
19b50 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a  By->nExpr;..  /*
19b60 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f   For operators o
19b70 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
19b80 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ALL we have to m
19b90 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
19ba0 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
19bb0 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76  clause covers ev
19bc0 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
19bd0 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64  result set.  Add
19be0 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74  .  ** terms to t
19bf0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19c00 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  se as necessary.
19c10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d  .  */.  if( op!=
19c20 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f  TK_ALL ){.    fo
19c30 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f  r(i=1; db->mallo
19c40 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c  cFailed==0 && i<
19c50 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
19c60 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
19c70 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
19c80 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
19c90 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
19ca0 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
19cb0 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70  nOrderBy; j++, p
19cc0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
19cd0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
19ce0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
19cf0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
19d00 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
19d10 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65  erByCol==i ) bre
19d20 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
19d30 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42    if( j==nOrderB
19d40 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  y ){.        Exp
19d50 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
19d60 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54  3Expr(db, TK_INT
19d70 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20  EGER, 0);.      
19d80 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
19d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
19da0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
19db0 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
19dc0 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
19dd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
19de0 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  alue = i;.      
19df0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
19e00 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
19e10 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
19e20 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
19e30 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  y, pNew);.      
19e40 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
19e50 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72   pOrderBy->a[nOr
19e60 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72  derBy++].u.x.iOr
19e70 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
19e80 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  i;.      }.    }
19e90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
19ea0 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
19eb0 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e  n permutation an
19ec0 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69  d keyinfo that i
19ed0 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a  s used with.  **
19ee0 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e   the permutation
19ef0 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
19f00 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20  ne if the next. 
19f10 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c   ** row of resul
19f20 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65  ts comes from se
19f30 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42  lectA or selectB
19f40 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c  .  Also add expl
19f50 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74  icit.  ** collat
19f60 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45  ions to the ORDE
19f70 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d  R BY clause term
19f80 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74  s so that when t
19f90 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  he subqueries.  
19fa0 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20  ** to the right 
19fb0 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65  and the left are
19fc0 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79   evaluated, they
19fd0 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74   use the correct
19fe0 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e  .  ** collation.
19ff0 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65  .  */.  aPermute
1a000 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1a010 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65  ocRawNN(db, size
1a020 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42  of(int)*(nOrderB
1a030 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61  y + 1));.  if( a
1a040 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
1a050 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1a060 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1a070 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f  aPermute[0] = nO
1a080 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28  rderBy;.    for(
1a090 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=1, pItem=pOrde
1a0a0 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65  rBy->a; i<=nOrde
1a0b0 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
1a0c0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
1a0d0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
1a0e0 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
1a0f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1a100 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1a110 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
1a120 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
1a130 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
1a140 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1a150 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
1a160 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75    pKeyMerge = mu
1a170 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
1a180 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
1a190 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p, 1);.  }else{.
1a1a0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1a1b0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
1a1c0 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
1a1d0 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
1a1e0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
1a1f0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1a200 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
1a210 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
1a220 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
1a230 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
1a240 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
1a250 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
1a260 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
1a270 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
1a280 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
1a290 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
1a2a0 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
1a2b0 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
1a2c0 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
1a2d0 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
1a2e0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
1a2f0 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
1a300 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
1a310 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1a320 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
1a330 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
1a340 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
1a350 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
1a360 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
1a370 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
1a380 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1a390 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
1a3a0 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
1a3b0 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
1a3c0 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31  >nMem += nExpr+1
1a3d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a3e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
1a3f0 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
1a400 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
1a410 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
1a420 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c  Alloc(db, nExpr,
1a430 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65   1);.    if( pKe
1a440 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73  yDup ){.      as
1a450 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
1a460 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
1a470 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20  pKeyDup) );.    
1a480 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
1a490 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1a4a0 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
1a4b0 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
1a4c0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
1a4d0 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
1a4e0 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
1a4f0 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
1a500 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
1a510 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
1a520 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
1a530 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
1a540 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
1a550 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
1a560 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1a570 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
1a580 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
1a590 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  pBy(pParse, p, p
1a5a0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
1a5b0 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69  ER");.  if( pPri
1a5c0 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b  or->pPrior==0 ){
1a5d0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
1a5e0 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
1a5f0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
1a600 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1a610 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a  , "ORDER");.  }.
1a620 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1a630 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
1a640 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
1a650 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
1a660 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64  rse, p, labelEnd
1a670 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
1a680 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c  it && op==TK_ALL
1a690 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74   ){.    regLimit
1a6a0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1a6b0 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74  em;.    regLimit
1a6c0 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
1a6d0 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
1a6e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a6f0 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74  Copy, p->iOffset
1a700 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20   ? p->iOffset+1 
1a710 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20  : p->iLimit,.   
1a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a740 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73  egLimitA);.    s
1a750 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a760 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67  (v, OP_Copy, reg
1a770 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74  LimitA, regLimit
1a780 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  B);.  }else{.   
1a790 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67   regLimitA = reg
1a7a0 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a  LimitB = 0;.  }.
1a7b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1a7c0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
1a7d0 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  t);.  p->pLimit 
1a7e0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
1a7f0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
1a800 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70  pOffset);.  p->p
1a810 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72  Offset = 0;..  r
1a820 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72  egAddrA = ++pPar
1a830 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41  se->nMem;.  regA
1a840 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrB = ++pParse-
1a850 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41  >nMem;.  regOutA
1a860 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a870 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b  m;.  regOutB = +
1a880 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a890 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1a8a0 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53  stInit(&destA, S
1a8b0 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  RT_Coroutine, re
1a8c0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
1a8d0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
1a8e0 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72  (&destB, SRT_Cor
1a8f0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1a900 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1a910 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1a920 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1a930 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1a940 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20  o the.  ** left 
1a950 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1a960 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22  operator - the "
1a970 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  A" select..  */.
1a980 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20    addrSelectA = 
1a990 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1a9a0 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20  ntAddr(v) + 1;. 
1a9b0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
1a9c0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1a9d0 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
1a9e0 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64  regAddrA, 0, add
1a9f0 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62  rSelectA);.  Vdb
1aa00 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65  eComment((v, "le
1aa10 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ft SELECT"));.  
1aa20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
1aa30 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78   regLimitA;.  ex
1aa40 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
1aa50 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69  iSub1, pParse->i
1aa60 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
1aa70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
1aa80 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
1aa90 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65  destA);.  sqlite
1aaa0 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1aab0 65 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  e(v, regAddrA);.
1aac0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1aad0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1aae0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1aaf0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1ab00 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1ab10 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20  CT statement on 
1ab20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20  .  ** the right 
1ab30 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63 74  - the "B" select
1ab40 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
1ab50 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctB = sqlite3Vdb
1ab60 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
1ab70 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  + 1;.  addr1 = s
1ab80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ab90 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
1aba0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20  tine, regAddrB, 
1abb0 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  0, addrSelectB);
1abc0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1abd0 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43 54  v, "right SELECT
1abe0 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
1abf0 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
1ac00 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
1ac10 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
1ac20 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
1ac30 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
1ac40 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69   = 0;  .  explai
1ac50 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
1ac60 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
1ac70 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
1ac80 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1ac90 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20  e, p, &destB);. 
1aca0 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76   p->iLimit = sav
1acb0 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f  edLimit;.  p->iO
1acc0 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66  ffset = savedOff
1acd0 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  set;.  sqlite3Vd
1ace0 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
1acf0 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20  , regAddrB);..  
1ad00 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1ad10 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
1ad20 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
1ad30 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20  t row of the A. 
1ad40 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
1ad50 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
1ad60 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
1ad70 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
1ad80 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1ad90 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
1ada0 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20  tine for A"));. 
1adb0 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65   addrOutA = gene
1adc0 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
1add0 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
1adf0 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20   &destA, pDest, 
1ae00 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20  regOutA,.       
1ae10 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
1ae20 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
1ae30 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47  lEnd);.  .  /* G
1ae40 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1ae50 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
1ae60 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
1ae70 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20  w of the B.  ** 
1ae80 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
1ae90 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
1aea0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
1aeb0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lect..  */.  if(
1aec0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1aed0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1aee0 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1aef0 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1af00 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b  outine for B"));
1af10 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20  .    addrOutB = 
1af20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
1af30 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
1af40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1af50 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65    p, &destB, pDe
1af60 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20  st, regOutB,.   
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1af80 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
1af90 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20  labelEnd);.  }. 
1afa0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
1afb0 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a  nref(pKeyDup);..
1afc0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1afd0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
1afe0 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
1aff0 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41  ts from select A
1b000 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
1b010 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
1b020 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65  a in select B re
1b030 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
1b040 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
1b050 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
1b060 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
1b070 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f  ofA_noB = addrEo
1b080 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20  fA = labelEnd;. 
1b090 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
1b0a0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b0b0 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74  , "eof-A subrout
1b0c0 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1b0d0 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64  EofA = sqlite3Vd
1b0e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1b0f0 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
1b100 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64  ddrOutB);.    ad
1b110 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c  drEofA_noB = sql
1b120 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b130 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1b140 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  ddrB, labelEnd);
1b150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
1b180 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
1b190 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
1b1a0 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e  drEofA);.    p->
1b1b0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
1b1c0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d  ite3LogEstAdd(p-
1b1d0 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72  >nSelectRow, pPr
1b1e0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29  ior->nSelectRow)
1b1f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1b200 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1b210 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
1b220 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
1b230 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65  elect B.  ** are
1b240 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
1b250 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
1b260 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct A remains..  
1b270 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1b280 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1b290 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72   addrEofB = addr
1b2a0 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d  EofA;.    if( p-
1b2b0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50  >nSelectRow > pP
1b2c0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1b2d0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
1b2e0 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
1b2f0 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20  ctRow;.  }else{ 
1b300 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
1b310 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42  mment((v, "eof-B
1b320 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1b330 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73      addrEofB = s
1b340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b350 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1b360 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
1b370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b380 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b390 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c  eld, regAddrA, l
1b3a0 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f  abelEnd); VdbeCo
1b3b0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b3c0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1b3d0 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d  , addrEofB);.  }
1b3e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b3f0 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1b400 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20  he case of A<B. 
1b410 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1b420 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d  mment((v, "A-lt-
1b430 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1b440 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71  .  addrAltB = sq
1b450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b460 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
1b470 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
1b480 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b490 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b4a0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1b4b0 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1b4c0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1b4d0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1b4e0 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
1b4f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1b500 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1b510 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
1b520 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1b530 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
1b540 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
1b550 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
1b560 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1b570 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1b580 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
1b590 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1b5a0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1b5b0 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
1b5c0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1b5d0 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
1b5e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b5f0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b600 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
1b610 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b620 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1b630 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43  beGoto(v, labelC
1b640 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  mpr);.  }..  /* 
1b650 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1b660 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1b670 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56   of A>B.  */.  V
1b680 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1b690 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f  v, "A-gt-B subro
1b6a0 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
1b6b0 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AgtB = sqlite3Vd
1b6c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1b6d0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  ;.  if( op==TK_A
1b6e0 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
1b6f0 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ON ){.    sqlite
1b700 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b710 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1b720 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d  , addrOutB);.  }
1b730 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b740 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b750 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1b760 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1b770 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1b780 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1b790 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
1b7a0 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
1b7b0 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
1b7c0 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
1b7d0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
1b7e0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
1b7f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b800 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b810 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1b820 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62  drEofA_noB); Vdb
1b830 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1b840 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b850 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b860 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
1b870 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  B); VdbeCoverage
1b880 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  (v);..  /* Imple
1b890 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
1b8a0 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
1b8b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
1b8c0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
1b8d0 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
1b8e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1b8f0 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
1b900 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
1b910 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
1b920 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
1b930 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1b940 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
1b950 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73  Sdst, destB.iSds
1b960 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20  t, nOrderBy,.   
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
1b990 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e  yMerge, P4_KEYIN
1b9a0 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FO);.  sqlite3Vd
1b9b0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
1b9c0 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20  FLAG_PERMUTE);. 
1b9d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b9e0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
1b9f0 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
1ba00 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64  B, addrAgtB); Vd
1ba10 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
1ba20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
1ba30 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
1ba40 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74  rder to terminat
1ba50 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
1ba60 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
1ba70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
1ba80 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  abelEnd);..  /* 
1ba90 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63  Reassembly the c
1baa0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f  ompound query so
1bab0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
1bac0 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79   freed correctly
1bad0 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  .  ** by the cal
1bae0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
1baf0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
1bb00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1bb10 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1bb20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a  p->pPrior);.  }.
1bb30 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
1bb40 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  rior;.  pPrior->
1bb50 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a  pNext = p;..  /*
1bb60 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20  ** TBD:  Insert 
1bb70 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73  subroutine calls
1bb80 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72   to close cursor
1bb90 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a  s on incomplete.
1bba0 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65    **** subquerie
1bbb0 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69  s ****/.  explai
1bbc0 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73  nComposite(pPars
1bbd0 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c  e, p->op, iSub1,
1bbe0 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65   iSub2, 0);.  re
1bbf0 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1bc00 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1bc10 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1bc20 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1bc30 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1bc40 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1bc50 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
1bc60 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e   of the SubstCon
1bc70 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63  text object desc
1bc80 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74  ribes an substit
1bc90 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f  ution edit.** to
1bca0 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
1bcb0 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a   a parse tree..*
1bcc0 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e  *.** All referen
1bcd0 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
1bce0 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61  n table iTable a
1bcf0 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  re to be replace
1bd00 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  d by correspondi
1bd10 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
1bd20 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a  s in pEList..*/.
1bd30 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1bd40 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20  ubstContext {.  
1bd50 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1bd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bd70 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1bd80 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1bd90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bda0 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72  /* Replace refer
1bdb0 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
1bdc0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
1bdd0 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  wTable;         
1bde0 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20     /* New table 
1bdf0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1be00 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20  isLeftJoin;     
1be10 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f        /* Add TK_
1be20 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f  IF_NULL_ROW opco
1be30 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c  des on each repl
1be40 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  acement */.  Exp
1be50 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1be60 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1be70 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  ement expression
1be80 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74  s */.} SubstCont
1be90 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ext;../* Forward
1bea0 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1beb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1bec0 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74  stExprList(Subst
1bed0 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69  Context*, ExprLi
1bee0 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1bef0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75  d substSelect(Su
1bf00 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c  bstContext*, Sel
1bf10 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ect*, int);../*.
1bf20 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1bf30 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1bf40 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1bf50 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1bf60 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1bf70 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1bf80 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1bf90 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1bfa0 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1bfb0 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1bfc0 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1bfd0 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1bfe0 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1bff0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1c000 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1c010 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1c020 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1c030 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1c040 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1c050 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1c060 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1c070 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1c080 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1c090 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1c0a0 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1c0b0 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1c0c0 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1c0d0 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1c0e0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1c0f0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
1c100 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
1c110 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
1c120 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
1c130 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
1c140 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
1c150 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
1c160 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1c170 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
1c180 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
1c190 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43  stExpr(.  SubstC
1c1a0 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1c1b0 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1c1c0 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1c1d0 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1c1e0 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1c1f0 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
1c200 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
1c210 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  curs */.){.  if(
1c220 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1c230 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 0;.  if( Expr
1c240 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1c250 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  r, EP_FromJoin) 
1c260 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  && pExpr->iRight
1c270 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62 73  JoinTable==pSubs
1c280 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  t->iTable ){.   
1c290 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
1c2a0 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  inTable = pSubst
1c2b0 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d  ->iNewTable;.  }
1c2c0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1c2d0 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
1c2e0 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53  Expr->iTable==pS
1c2f0 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a  ubst->iTable ){.
1c300 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
1c310 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
1c320 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
1c330 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
1c340 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
1c350 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
1c360 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74 2d 3e  pCopy = pSubst->
1c370 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d  pEList->a[pExpr-
1c380 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b  >iColumn].pExpr;
1c390 0a 20 20 20 20 20 20 45 78 70 72 20 69 66 4e 75  .      Expr ifNu
1c3a0 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61 73 73  llRow;.      ass
1c3b0 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70 45 4c  ert( pSubst->pEL
1c3c0 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
1c3d0 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74 2d  >iColumn<pSubst-
1c3e0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
1c3f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1c400 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
1c410 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
1c420 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
1c430 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56 65   sqlite3ExprIsVe
1c440 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a 20  ctor(pCopy) ){. 
1c450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 65         sqlite3Ve
1c460 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53 75  ctorErrorMsg(pSu
1c470 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43 6f  bst->pParse, pCo
1c480 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  py);.      }else
1c490 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1c4a0 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d 3e  3 *db = pSubst->
1c4b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
1c4c0 20 20 20 20 69 66 28 20 70 53 75 62 73 74 2d 3e      if( pSubst->
1c4d0 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70 43  isLeftJoin && pC
1c4e0 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  opy->op!=TK_COLU
1c4f0 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  MN ){.          
1c500 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52 6f  memset(&ifNullRo
1c510 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66 4e  w, 0, sizeof(ifN
1c520 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20 20  ullRow));.      
1c530 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70      ifNullRow.op
1c540 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f   = TK_IF_NULL_RO
1c550 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e  W;.          ifN
1c560 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20 70  ullRow.pLeft = p
1c570 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20  Copy;.          
1c580 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c 65  ifNullRow.iTable
1c590 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1c5a0 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1c5b0 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c 52  pCopy = &ifNullR
1c5c0 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ow;.        }.  
1c5d0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
1c5e0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1c5f0 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20 20  pCopy, 0);.     
1c600 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 70     if( pNew && p
1c610 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69  Subst->isLeftJoi
1c620 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  n ){.          E
1c630 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1c640 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c  New, EP_CanBeNul
1c650 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
1c660 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
1c670 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
1c680 79 28 70 45 78 70 72 2c 45 50 5f 46 72 6f 6d 4a  y(pExpr,EP_FromJ
1c690 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oin) ){.        
1c6a0 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a 6f    pNew->iRightJo
1c6b0 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d  inTable = pExpr-
1c6c0 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
1c6d0 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
1c6e0 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77  SetProperty(pNew
1c6f0 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a  , EP_FromJoin);.
1c700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c710 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1c720 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
1c730 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1c740 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNew;.      }.  
1c750 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c760 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
1c770 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 26  TK_IF_NULL_ROW &
1c780 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
1c790 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20  =pSubst->iTable 
1c7a0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1c7b0 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d  iTable = pSubst-
1c7c0 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >iNewTable;.    
1c7d0 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  }.    pExpr->pLe
1c7e0 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ft = substExpr(p
1c7f0 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c  Subst, pExpr->pL
1c800 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  eft);.    pExpr-
1c810 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45  >pRight = substE
1c820 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1c830 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
1c840 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c850 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1c860 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1c870 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 53    substSelect(pS
1c880 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1c890 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20  Select, 1);.    
1c8a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62  }else{.      sub
1c8b0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1c8c0 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t, pExpr->x.pLis
1c8d0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1c8e0 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
1c8f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1c900 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53 75 62  tExprList(.  Sub
1c910 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1c920 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1c930 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1c940 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ution */.  ExprL
1c950 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20  ist *pList      
1c960 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e   /* List to scan
1c970 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f   and in which to
1c980 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65   make substitute
1c990 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
1c9a0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1c9b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1c9c0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1c9d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
1c9e0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1c9f0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1ca00 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  bst, pList->a[i]
1ca10 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 73  .pExpr);.  }.}.s
1ca20 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1ca30 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73 74 43  Select(.  SubstC
1ca40 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1ca50 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1ca60 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69  f the substituti
1ca70 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1ca80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1ca90 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1caa0 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
1cab0 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
1cac0 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f   */.  int doPrio
1cad0 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  r           /* D
1cae0 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e  o substitutes on
1caf0 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a   p->pPrior too *
1cb00 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
1cb10 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
1cb20 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1cb30 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1cb40 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
1cb50 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45    do{.    substE
1cb60 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1cb70 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
1cb80 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1cb90 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70 42  ubst, p->pGroupB
1cba0 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  y);.    substExp
1cbb0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1cbc0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
1cbd0 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  p->pHaving = sub
1cbe0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1cbf0 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
1cc00 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
1cc10 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d  tExpr(pSubst, p-
1cc20 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 70 53  >pWhere);.    pS
1cc30 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
1cc40 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
1cc50 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  0 );.    for(i=p
1cc60 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d  Src->nSrc, pItem
1cc70 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69  =pSrc->a; i>0; i
1cc80 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
1cc90 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1cca0 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 70  pSubst, pItem->p
1ccb0 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20  Select, 1);.    
1ccc0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1ccd0 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
1cce0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1ccf0 73 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  st(pSubst, pItem
1cd00 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a  ->u1.pFuncArg);.
1cd10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1cd20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20  }while( doPrior 
1cd30 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f  && (p = p->pPrio
1cd40 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69  r)!=0 );.}.#endi
1cd50 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
1cd60 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1cd70 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1cd80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1cd90 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
1cda0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1cdb0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1cdc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1cdd0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
1cde0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
1cdf0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
1ce00 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65  bqueries as a pe
1ce10 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
1ce20 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  zation..** This 
1ce30 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1ce40 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
1ce50 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
1ce60 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63  o flattening occ
1ce70 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
1ce80 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
1ce90 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
1cea0 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
1ceb0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
1cec0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
1ced0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
1cee0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1cef0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1cf00 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
1cf10 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
1cf20 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
1cf30 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
1cf40 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
1cf50 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
1cf60 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
1cf70 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
1cf80 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
1cf90 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
1cfa0 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
1cfb0 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
1cfc0 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
1cfd0 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
1cfe0 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
1cff0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
1d000 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
1d010 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
1d020 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
1d030 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
1d040 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d050 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
1d060 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
1d070 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1d080 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
1d090 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
1d0a0 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
1d0b0 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
1d0c0 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
1d0d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1d0e0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1d0f0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
1d100 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
1d110 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
1d120 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69   for this simpli
1d130 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
1d140 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
1d150 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
1d160 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
1d170 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
1d180 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
1d190 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
1d1a0 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
1d1b0 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
1d1c0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
1d1d0 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
1d1e0 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
1d1f0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
1d200 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
1d210 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1d220 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
1d230 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1d240 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d250 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
1d260 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1d270 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
1d280 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1d290 61 67 67 72 65 67 61 74 65 20 6f 72 20 28 32 61  aggregate or (2a
1d2a0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1d2b0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  y is not a join.
1d2c0 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 28 32  **        and (2
1d2d0 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  b) the outer que
1d2e0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1d2f0 73 75 62 71 75 65 72 69 65 73 20 6f 74 68 65 72  subqueries other
1d300 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a   than the one.**
1d310 20 20 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61          FROM-cla
1d320 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61  use subquery tha
1d330 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  t is a candidate
1d340 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e   for flattening.
1d350 20 20 28 32 62 20 69 73 0a 2a 2a 20 20 20 20 20    (2b is.**     
1d360 20 20 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74     due to ticket
1d370 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1d380 66 38 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30  f80] from 2015-0
1d390 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1d3a0 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1d3b0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
1d3c0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
1d3d0 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 20 20 20 20  EFT JOIN.**     
1d3e0 20 20 20 6f 72 20 28 61 29 20 74 68 65 20 73 75     or (a) the su
1d3f0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74  bquery is not it
1d400 73 65 6c 66 20 61 20 6a 6f 69 6e 20 61 6e 64 20  self a join and 
1d410 28 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  (b) the FROM cla
1d420 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66  use.**        of
1d430 20 74 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   the subquery do
1d440 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
1d450 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 61   virtual table a
1d460 6e 64 20 28 63 29 20 74 68 65 20 0a 2a 2a 20 20  nd (c) the .**  
1d470 20 20 20 20 20 20 6f 75 74 65 72 20 71 75 65 72        outer quer
1d480 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1d490 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  egate..**.**   (
1d4a0 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  4)  The subquery
1d4b0 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54   is not DISTINCT
1d4c0 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41  ..**.**  (**)  A
1d4d0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74  t one point rest
1d4e0 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64  rictions (4) and
1d4f0 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73   (5) defined a s
1d500 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43  ubset of DISTINC
1d510 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d  T.**        sub-
1d520 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72  queries that wer
1d530 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20  e excluded from 
1d540 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1d550 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a  n. Restriction .
1d560 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61  **        (4) ha
1d570 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70  s since been exp
1d580 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65  anded to exclude
1d590 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75   all DISTINCT su
1d5a0 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20  bqueries..**.** 
1d5b0 20 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75    (6)  The subqu
1d5c0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1d5d0 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
1d5e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1d5f0 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1d600 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1d610 20 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75    (7)  The subqu
1d620 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63  ery has a FROM c
1d630 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46  lause.  TODO:  F
1d640 6f 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69  or subqueries wi
1d650 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  thout.**        
1d660 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63  A FROM clause, c
1d670 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61  onsider adding a
1d680 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 69 74   FROM clause wit
1d690 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a  h the special.**
1d6a0 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73 71          table sq
1d6b0 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63  lite_once that c
1d6c0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e  onsists of a sin
1d6d0 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69  gle row containi
1d6e0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73  ng a.**        s
1d6f0 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ingle NULL..**.*
1d700 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75 62  *   (8)  The sub
1d710 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1d720 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1d730 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1d740 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
1d750 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62 71     (9)  The subq
1d760 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1d770 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1d780 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1d790 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20  not use.**      
1d7a0 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a    aggregates..**
1d7b0 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72  .**  (**)  Restr
1d7c0 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20  iction (10) was 
1d7d0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1d7e0 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32   code on 2005-02
1d7f0 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20  -05 but we.**   
1d800 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20       accidently 
1d810 63 61 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d  carried the comm
1d820 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69  ent forward unti
1d830 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f  l 2014-09-15.  O
1d840 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  riginal.**      
1d850 20 20 74 65 78 74 3a 20 22 54 68 65 20 73 75 62    text: "The sub
1d860 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1d870 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1d880 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d890 20 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f 65 73   .**        does
1d8a0 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 22   not use LIMIT."
1d8b0 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68  .**.**  (11)  Th
1d8c0 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1d8d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1d8e0 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20  o not both have 
1d8f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
1d900 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e  ..**.**  (**)  N
1d910 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20  ot implemented. 
1d920 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72   Subsumed into r
1d930 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20  estriction (3). 
1d940 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a   Was previously.
1d950 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70 61  **        a sepa
1d960 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e  rate restriction
1d970 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74   deriving from t
1d980 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a  icket #350..**.*
1d990 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75 62  *  (13)  The sub
1d9a0 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20  query and outer 
1d9b0 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1d9c0 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a  h use LIMIT..**.
1d9d0 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75  **  (14)  The su
1d9e0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1d9f0 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  use OFFSET..**.*
1da00 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75 74  *  (15)  The out
1da10 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1da20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1da30 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65  nd select or the
1da40 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
1da50 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ery does not hav
1da60 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
1da70 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65  ..**        (See
1da80 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e   ticket #2339 an
1da90 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38  d ticket [02a8e8
1daa0 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  1d44])..**.**  (
1dab0 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  16)  The outer q
1dac0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
1dad0 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
1dae0 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a  subquery does.**
1daf0 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74          not cont
1db00 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28  ain ORDER BY.  (
1db10 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54  Ticket #2942)  T
1db20 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20  his used to not 
1db30 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  matter.**       
1db40 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64   until we introd
1db50 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63  uced the group_c
1db60 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e  oncat() function
1db70 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20  .  .**.**  (17) 
1db80 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   The sub-query i
1db90 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64  s not a compound
1dba0 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69   select, or it i
1dbb0 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a  s a UNION ALL .*
1dbc0 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e  *        compoun
1dbd0 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70  d clause made up
1dbe0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e   entirely of non
1dbf0 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1dc00 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20  es, and .**     
1dc10 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71 75     the parent qu
1dc20 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ery:.**.**      
1dc30 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73      * is not its
1dc40 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f  elf part of a co
1dc50 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a  mpound select,.*
1dc60 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1dc70 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1dc80 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65   or DISTINCT que
1dc90 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ry, and.**      
1dca0 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a      * is not a j
1dcb0 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  oin.**.**       
1dcc0 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20   The parent and 
1dcd0 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f  sub-query may co
1dce0 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75  ntain WHERE clau
1dcf0 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a  ses. Subject to.
1dd00 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73 20  **        rules 
1dd10 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28  (11), (13) and (
1dd20 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c  14), they may al
1dd30 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  so contain ORDER
1dd40 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c   BY,.**        L
1dd50 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
1dd60 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73 75  clauses.  The su
1dd70 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73  bquery cannot us
1dd80 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  e any compound.*
1dd90 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1dda0 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49  r other than UNI
1ddb0 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61  ON ALL because a
1ddc0 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d  ll the other com
1ddd0 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1dde0 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20 61  operators have a
1ddf0 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e  n implied DISTIN
1de00 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73 61  CT which is disa
1de10 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20  llowed by.**    
1de20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20      restriction 
1de30 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  (4)..**.**      
1de40 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d    Also, each com
1de50 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75  ponent of the su
1de60 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65 74  b-query must ret
1de70 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  urn the same num
1de80 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66  ber.**        of
1de90 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e   result columns.
1dea0 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c   This is actuall
1deb0 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20  y a requirement 
1dec0 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  for any compound
1ded0 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43  .**        SELEC
1dee0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  T statement, but
1def0 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65   all the code he
1df00 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20  re does is make 
1df10 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20  sure that no.** 
1df20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c         such (ill
1df30 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20  egal) sub-query 
1df40 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68  is flattened. Th
1df50 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65  e caller will de
1df60 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20  tect the.**     
1df70 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20     syntax error 
1df80 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65 74  and return a det
1df90 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a  ailed message..*
1dfa0 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74  *.**  (18)  If t
1dfb0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1dfc0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1dfd0 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d  t, then all term
1dfe0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  s of the.**     
1dff0 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75     ORDER by clau
1e000 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  se of the parent
1e010 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20   must be simple 
1e020 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a  references to .*
1e030 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73  *        columns
1e040 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   of the sub-quer
1e050 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20  y..**.**  (19)  
1e060 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1e070 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1e080 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1e090 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20  ry does not.**  
1e0a0 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48 45        have a WHE
1e0b0 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  RE clause..**.**
1e0c0 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20 73    (20)  If the s
1e0d0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1e0e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1e0f0 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20  hen it must not 
1e100 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  use.**        an
1e110 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1e120 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e  .  Ticket #3773.
1e130 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78    We could relax
1e140 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
1e150 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77  .**        somew
1e160 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74 68  hat by saying th
1e170 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  at the terms of 
1e180 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1e190 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20  use must.**     
1e1a0 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d     appear as unm
1e1b0 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20 63  odified result c
1e1c0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75  olumns in the ou
1e1d0 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ter query.  But 
1e1e0 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  we.**        hav
1e1f0 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
1e200 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f  tions in mind to
1e210 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74 20   deal with that 
1e220 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31  case..**.**  (21
1e230 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1e240 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1e250 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1e260 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1e270 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1e280 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37    (See ticket [7
1e290 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a  52e1646fc])..**.
1e2a0 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73 75  **  (22)  The su
1e2b0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  bquery is not a 
1e2c0 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a  recursive CTE..*
1e2d0 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20  *.**  (23)  The 
1e2e0 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20  parent is not a 
1e2f0 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f  recursive CTE, o
1e300 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  r the sub-query 
1e310 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20  is not a.**     
1e320 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72     compound quer
1e330 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63 74  y. This restrict
1e340 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20 74  ion is because t
1e350 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a  ransforming the.
1e360 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74  **        parent
1e370 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   to a compound q
1e380 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68  uery confuses th
1e390 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64  e code that hand
1e3a0 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  les.**        re
1e3b0 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73 20  cursive queries 
1e3c0 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29  in multiSelect()
1e3d0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54  ..**.**  (24)  T
1e3e0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
1e3f0 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1e400 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
1e410 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
1e420 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
1e430 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
1e440 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
1e450 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
1e460 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
1e470 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
1e480 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
1e490 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
1e4a0 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
1e4b0 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
1e4c0 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
1e4d0 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
1e4e0 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
1e4f0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
1e500 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
1e510 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
1e520 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
1e530 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1e540 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
1e550 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
1e560 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1e570 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
1e580 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
1e590 65 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49  es and subqueryI
1e5a0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
1e5b0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1e5c0 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a  s aggregates..**
1e5d0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
1e5e0 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  g is not attempt
1e5f0 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
1e600 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
1e610 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66  returns 0..** If
1e620 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61   flattening is a
1e630 74 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f  ttempted this ro
1e640 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
1e650 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68  .**.** All of th
1e660 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61  e expression ana
1e670 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72  lysis must occur
1e680 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74   on both the out
1e690 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20  er query and.** 
1e6a0 74 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66  the subquery bef
1e6b0 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
1e6c0 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   runs..*/.static
1e6d0 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71   int flattenSubq
1e6e0 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70  uery(.  Parse *p
1e6f0 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
1e700 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
1e710 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
1e720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e730 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72   parent or outer
1e740 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1e750 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d  t */.  int iFrom
1e760 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
1e770 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d  ndex in p->pSrc-
1e780 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65  >a[] of the inne
1e790 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  r subquery */.  
1e7a0 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20  int isAgg,      
1e7b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e7c0 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65  outer SELECT use
1e7d0 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1e7e0 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73  tions */.  int s
1e7f0 75 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20  ubqueryIsAgg    
1e800 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
1e810 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67  ubquery uses agg
1e820 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
1e830 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1e840 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43  har *zSavedAuthC
1e850 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
1e860 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
1e870 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74   Select *pParent
1e880 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20  ;    /* Current 
1e890 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f  UNION ALL term o
1e8a0 66 20 74 68 65 20 6f 74 68 65 72 20 71 75 65 72  f the other quer
1e8b0 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  y */.  Select *p
1e8c0 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
1e8d0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
1e8e0 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
1e8f0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
1e900 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1e910 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
1e920 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
1e930 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1e940 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
1e950 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1e960 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1e970 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1e980 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
1e990 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1e9a0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1e9b0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
1e9c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
1e9d0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
1e9e0 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
1e9f0 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
1ea00 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61   */.  int iNewPa
1ea10 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70  rent = -1;/* Rep
1ea20 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66  lacement table f
1ea30 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20  or iParent */.  
1ea40 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d  int isLeftJoin =
1ea50 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70   0; /* True if p
1ea60 53 75 62 20 69 73 20 74 68 65 20 72 69 67 68 74  Sub is the right
1ea70 20 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20   side of a LEFT 
1ea80 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e  JOIN */    .  in
1ea90 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1eaa0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1eab0 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
1eac0 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
1ead0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1eae0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1eaf0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1eb00 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
1eb10 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
1eb20 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
1eb30 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1eb40 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
1eb50 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
1eb60 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
1eb70 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
1eb80 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1eb90 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
1eba0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
1ebb0 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f  );  /* Unable to
1ebc0 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e   flatten compoun
1ebd0 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  d queries */.  i
1ebe0 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1ebf0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1ec00 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
1ec10 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
1ec20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1ec30 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
1ec40 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
1ec50 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
1ec60 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
1ec70 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
1ec80 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
1ec90 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
1eca0 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
1ecb0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
1ecc0 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
1ecd0 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
1ece0 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20  sAgg ){.    if( 
1ecf0 69 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  isAgg ) return 0
1ed00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1ed30 28 31 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  (1)   */.    if(
1ed40 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
1ed50 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed70 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ed80 20 28 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66   (2a)  */.    if
1ed90 28 20 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20  ( (p->pWhere && 
1eda0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1edb0 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62  p->pWhere,EP_Sub
1edc0 71 75 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20  query)).     || 
1edd0 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1ede0 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29  Flags(p->pEList)
1edf0 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21   & EP_Subquery)!
1ee00 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69  =0.     || (sqli
1ee10 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
1ee20 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20  (p->pOrderBy) & 
1ee30 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a  EP_Subquery)!=0.
1ee40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1ee50 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee80 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ee90 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  2b)  */.    }.  
1eea0 7d 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  }..  pSubSrc = p
1eeb0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
1eec0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
1eed0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
1eee0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
1eef0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1ef00 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
1ef10 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
1ef20 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
1ef30 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
1ef40 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
1ef50 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
1ef60 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1ef70 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
1ef80 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1ef90 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1efa0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
1efb0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1efc0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
1efd0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1efe0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
1eff0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
1f000 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
1f010 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
1f020 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f030 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
1f040 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f050 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f060 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
1f070 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
1f080 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f0b0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
1f0c0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f0d0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
1f0e0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
1f0f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f130 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
1f140 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1f150 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
1f160 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f180 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
1f190 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1f1a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1f1b0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1f1c0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
1f1d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
1f1e0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1f1f0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
1f200 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
1f210 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
1f220 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1f230 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
1f240 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
1f250 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1f260 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1f270 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1f280 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
1f290 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1f2a0 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
1f2b0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
1f2c0 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
1f2d0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1f2e0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f320 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
1f330 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
1f340 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f350 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1f360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f370 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
1f380 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1f390 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
1f3a0 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
1f3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f3c0 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
1f3d0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1f3e0 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
1f3f0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1f400 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
1f410 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f420 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f430 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65  (21) */.  }.  te
1f440 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65  stcase( pSub->se
1f450 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1f460 72 73 69 76 65 20 29 3b 0a 20 20 74 65 73 74 63  rsive );.  testc
1f470 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c  ase( pSub->selFl
1f480 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41  ags & SF_MinMaxA
1f490 67 67 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62  gg );.  if( pSub
1f4a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1f4b0 5f 52 65 63 75 72 73 69 76 65 7c 53 46 5f 4d 69  _Recursive|SF_Mi
1f4c0 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20 20 20 20  nMaxAgg) ){.    
1f4d0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1f4e0 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 61  trictions (22) a
1f4f0 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20  nd (24) */.  }. 
1f500 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1f510 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1f520 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  ) && pSub->pPrio
1f530 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f540 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1f550 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20  n (23) */.  }.. 
1f560 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
1f570 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1f580 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1f590 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
1f5a0 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  en the.  ** subq
1f5b0 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1f5c0 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66 2e 20 20  a join itself.  
1f5d0 45 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74  Example of why t
1f5e0 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
1f5f0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1f600 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1f610 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
1f620 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
1f630 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
1f640 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
1f650 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
1f660 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
1f670 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
1f680 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
1f690 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
1f6a0 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
1f6b0 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hing..  **.  ** 
1f6c0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f6d0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1f6e0 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
1f6f0 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75  OIN, then the ou
1f700 74 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63  ter.  ** query c
1f710 61 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72  annot be an aggr
1f720 65 67 61 74 65 2e 20 20 54 68 69 73 20 69 73 20  egate.  This is 
1f730 61 6e 20 61 72 74 69 66 61 63 74 20 6f 66 20 74  an artifact of t
1f740 68 65 20 77 61 79 20 61 67 67 72 65 67 61 74 65  he way aggregate
1f750 73 0a 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65  s.  ** are proce
1f760 73 73 65 64 20 2d 20 74 68 65 72 65 20 69 73 20  ssed - there is 
1f770 6e 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20  no mechanism to 
1f780 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
1f790 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
1f7a0 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
1f7b0 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20  all-NULL..  **. 
1f7c0 20 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 69 63   ** See also tic
1f7d0 6b 65 74 73 20 23 33 30 36 2c 20 23 33 35 30 2c  kets #306, #350,
1f7e0 20 61 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f   and #3300..  */
1f7f0 0a 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d  .  if( (pSubitem
1f800 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
1f810 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
1f820 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d      isLeftJoin =
1f830 20 31 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62   1;.    if( pSub
1f840 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69  Src->nSrc>1 || i
1f850 73 41 67 67 20 7c 7c 20 49 73 56 69 72 74 75 61  sAgg || IsVirtua
1f860 6c 28 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e  l(pSubSrc->a[0].
1f870 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 72  pTab) ){.      r
1f880 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74  eturn 0; /* Rest
1f890 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20  riction (3) */. 
1f8a0 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
1f8b0 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e  SQLITE_EXTRA_IFN
1f8c0 55 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66  ULLROW.  else if
1f8d0 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73  ( iFrom>0 && !is
1f8e0 41 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  Agg ){.    /* Se
1f8f0 74 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e  tting isLeftJoin
1f900 20 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50   to -1 causes OP
1f910 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64  _IfNullRow opcod
1f920 65 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  es to be generat
1f930 65 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76  ed for.    ** ev
1f940 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
1f950 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75   any result colu
1f960 6d 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79  mn from subquery
1f970 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e   in a join, even
1f980 20 74 68 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74   though.    ** t
1f990 68 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65  hey are not nece
1f9a0 73 73 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c  ssary.  This wil
1f9b0 6c 20 73 74 72 65 73 73 2d 74 65 73 74 20 74 68  l stress-test th
1f9c0 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f  e OP_IfNullRow o
1f9d0 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73  pcode. */.    is
1f9e0 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20  LeftJoin = -1;. 
1f9f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1fa00 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20  Restriction 17: 
1fa10 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1fa20 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
1fa30 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d  ELECT, then it m
1fa40 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c  ust.  ** use onl
1fa50 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  y the UNION ALL 
1fa60 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f  operator. And no
1fa70 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65  ne of the simple
1fa80 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a   select queries.
1fa90 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75    ** that make u
1faa0 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  p the compound S
1fab0 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65  ELECT are allowe
1fac0 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74  d to be aggregat
1fad0 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20  e or distinct.  
1fae0 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f  ** queries..  */
1faf0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72  .  if( pSub->pPr
1fb00 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ior ){.    if( p
1fb10 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  Sub->pOrderBy ){
1fb20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1fb30 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1fb40 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20   20 */.    }.   
1fb50 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70   if( isAgg || (p
1fb60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1fb70 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20  Distinct)!=0 || 
1fb80 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b  pSrc->nSrc!=1 ){
1fb90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1fba0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
1fbb0 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31  Sub1=pSub; pSub1
1fbc0 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70  ; pSub1=pSub1->p
1fbd0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65  Prior){.      te
1fbe0 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1fbf0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1fc00 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1fc10 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
1fc20 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  nct );.      tes
1fc30 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
1fc40 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
1fc50 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
1fc60 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67  ate))==SF_Aggreg
1fc70 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ate );.      ass
1fc80 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21  ert( pSub->pSrc!
1fc90 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
1fca0 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  rt( pSub->pEList
1fcb0 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e  ->nExpr==pSub1->
1fcc0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1fcd0 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62  .      if( (pSub
1fce0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1fcf0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1fd00 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20 20  gregate))!=0.   
1fd10 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
1fd20 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
1fd30 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20  op!=TK_ALL) .   
1fd40 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
1fd50 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20  rc->nSrc<1.     
1fd60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1fd70 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
1fd80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 53      testcase( pS
1fd90 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e  ub1->pSrc->nSrc>
1fda0 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  1 );.    }..    
1fdb0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
1fdc0 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  8. */.    if( p-
1fdd0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
1fde0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1fdf0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d   for(ii=0; ii<p-
1fe00 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
1fe10 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
1fe20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1fe30 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64  ->a[ii].u.x.iOrd
1fe40 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74  erByCol==0 ) ret
1fe50 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1fe60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a     }.  }..  /***
1fe70 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  ** If we reach t
1fe80 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74  his point, flatt
1fe90 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74  ening is permitt
1fea0 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c  ed. *****/.  SEL
1feb0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
1fec0 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25 73  e,p,("flatten %s
1fed0 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25 64  .%p from term %d
1fee0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1fef0 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a 53          pSub->zS
1ff00 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69 46  elName, pSub, iF
1ff10 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74  rom));..  /* Aut
1ff20 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75  horize the subqu
1ff30 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  ery */.  pParse-
1ff40 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1ff50 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
1ff60 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29  .  TESTONLY(i =)
1ff70 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ff80 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1ff90 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
1ffa0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  );.  testcase( i
1ffb0 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b  ==SQLITE_DENY );
1ffc0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1ffd0 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
1ffe0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  AuthContext;..  
1fff0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  /* If the sub-qu
20000 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
20010 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
20020 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73  nt, then (by res
20030 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31  trictions.  ** 1
20040 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20  7 and 18 above) 
20050 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49  it must be a UNI
20060 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
20070 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
20080 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65   .  ** be of the
20090 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
200a0 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70       SELECT <exp
200b0 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73  r-list> FROM (<s
200c0 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72  ub-query>) <wher
200d0 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a  e-clause> .  **.
200e0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
200f0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
20100 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53  IMIT and/or OFFS
20110 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73  ET clauses. This
20120 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61   block.  ** crea
20130 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f  tes N-1 copies o
20140 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  f the parent que
20150 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f  ry without any O
20160 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f  RDER BY, LIMIT o
20170 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63  r .  ** OFFSET c
20180 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73  lauses and joins
20190 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66   them to the lef
201a0 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74  t-hand-side of t
201b0 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
201c0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c   using UNION ALL
201d0 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74   operators. In t
201e0 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68  his case N is th
201f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70  e number of simp
20200 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73  le.  ** select s
20210 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
20220 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
20230 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ery..  **.  ** E
20240 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
20250 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31  *     SELECT a+1
20260 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20   FROM (.  **    
20270 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
20280 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
20290 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
202a0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79          SELECT y
202b0 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
202c0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
202d0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
202e0 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d  CT abs(z*2) FROM
202f0 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29   tab2.  **     )
20300 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45   WHERE a!=5 ORDE
20310 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
20320 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
20330 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
20340 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d   SELECT x+1 FROM
20350 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d   tab WHERE x+1!=
20360 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
20370 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
20380 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61  LECT y+1 FROM ta
20390 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20  b WHERE y+1!=5. 
203a0 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
203b0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
203c0 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f  T abs(z*2)+1 FRO
203d0 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73  M tab2 WHERE abs
203e0 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20  (z*2)+1!=5.  ** 
203f0 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20      ORDER BY 1. 
20400 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c   **.  ** We call
20410 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f   this the "compo
20420 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
20430 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20  ttening"..  */. 
20440 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e   for(pSub=pSub->
20450 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53  pPrior; pSub; pS
20460 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
20470 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
20480 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ew;.    ExprList
20490 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
204a0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78  pOrderBy;.    Ex
204b0 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
204c0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72  pLimit;.    Expr
204d0 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70   *pOffset = p->p
204e0 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65  Offset;.    Sele
204f0 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
20500 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
20510 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
20520 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
20530 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
20540 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
20550 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73   0;.    p->pOffs
20560 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  et = 0;.    pNew
20570 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
20580 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
20590 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
205a0 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53  SetName(pNew, pS
205b0 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20  ub->zSelName);. 
205c0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
205d0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e  pOffset;.    p->
205e0 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
205f0 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
20600 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
20610 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
20620 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
20630 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ALL;.    if( pNe
20640 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
20650 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
20660 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20670 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
20680 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
20690 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72  if( pPrior ) pPr
206a0 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
206b0 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  w;.      pNew->p
206c0 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
206d0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
206e0 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  ;.      SELECTTR
206f0 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 0a  ACE(2,pParse,p,.
20700 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70 6f           ("compo
20710 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
20720 74 74 65 6e 65 72 20 63 72 65 61 74 65 73 20 25  ttener creates %
20730 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22 2c  s.%p as peer\n",
20740 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  .         pNew->
20750 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29 29  zSelName, pNew))
20760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20770 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20780 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
20790 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61  ..  /* Begin fla
207a0 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f  ttening the iFro
207b0 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68  m-th entry of th
207c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20  e FROM clause . 
207d0 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72   ** in the outer
207e0 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
207f0 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53  Sub = pSub1 = pS
20800 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
20810 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68  ..  /* Delete th
20820 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  e transient tabl
20830 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f  e structure asso
20840 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a  ciated with the.
20850 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20    ** subquery.  
20860 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
20870 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
20880 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73  >zDatabase);.  s
20890 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
208a0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
208b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
208c0 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d  ee(db, pSubitem-
208d0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62  >zAlias);.  pSub
208e0 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  item->zDatabase 
208f0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
20900 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53  >zName = 0;.  pS
20910 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ubitem->zAlias =
20920 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
20930 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20  pSelect = 0;..  
20940 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e  /* Defer deletin
20950 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  g the Table obje
20960 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
20970 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
20980 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20  uery until code 
20990 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20  generation is.  
209a0 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e  ** complete, sin
209b0 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69  ce there may sti
209c0 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54  ll exist Expr.pT
209d0 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a  ab entries that.
209e0 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68    ** refer to th
209f0 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20  e subquery even 
20a00 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  after flattening
20a10 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e  .  Ticket #3346.
20a20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69  .  **.  ** pSubi
20a30 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77  tem->pTab is alw
20a40 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20  ays non-NULL by 
20a50 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e  test restriction
20a60 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76  s and tests abov
20a70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c  e..  */.  if( AL
20a80 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70  WAYS(pSubitem->p
20a90 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54  Tab!=0) ){.    T
20aa0 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20  able *pTabToDel 
20ab0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  = pSubitem->pTab
20ac0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f  ;.    if( pTabTo
20ad0 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20  Del->nTabRef==1 
20ae0 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a  ){.      Parse *
20af0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
20b00 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
20b10 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
20b20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74  pTabToDel->pNext
20b30 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76  Zombie = pToplev
20b40 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a  el->pZombieTab;.
20b50 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d        pToplevel-
20b60 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54  >pZombieTab = pT
20b70 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c  abToDel;.    }el
20b80 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  se{.      pTabTo
20b90 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a  Del->nTabRef--;.
20ba0 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74      }.    pSubit
20bb0 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  em->pTab = 0;.  
20bc0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
20bd0 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
20be0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 65  once for each te
20bf0 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  rm in a compound
20c00 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66  -subquery.  ** f
20c10 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65  lattening (as de
20c20 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20  scribed above). 
20c30 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
20c40 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e   a different kin
20c50 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65  d.  ** of flatte
20c60 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e  ning - a flatten
20c70 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
20c80 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
20c90 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a  ry flattening -.
20ca0 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c    ** then this l
20cb0 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e  oop only runs on
20cc0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
20cd0 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c  is loop moves al
20ce0 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c  l of the FROM el
20cf0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75  ements of the su
20d00 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
20d10 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    ** the FROM cl
20d20 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
20d30 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65  r query.  Before
20d40 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d   doing this, rem
20d50 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  ember.  ** the c
20d60 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
20d70 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75   the original ou
20d80 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65  ter query FROM e
20d90 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69  lement in.  ** i
20da0 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61  Parent.  The iPa
20db0 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c  rent cursor will
20dc0 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e 20   never be used. 
20dd0 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65   Subsequent code
20de0 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20  .  ** will scan 
20df0 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b  expressions look
20e00 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ing for iParent 
20e10 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72  references and r
20e20 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73  eplace.  ** thos
20e30 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  e references wit
20e40 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  h expressions th
20e50 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68  at resolve to th
20e60 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a  e subquery FROM.
20e70 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65    ** elements we
20e80 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67   are now copying
20e90 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28   in..  */.  for(
20ea0 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65  pParent=p; pPare
20eb0 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72  nt; pParent=pPar
20ec0 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75  ent->pPrior, pSu
20ed0 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
20ee0 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63  .    int nSubSrc
20ef0 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79 70  ;.    u8 jointyp
20f00 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53  e = 0;.    pSubS
20f10 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
20f20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
20f30 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20  use of subquery 
20f40 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d  */.    nSubSrc =
20f50 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20   pSubSrc->nSrc; 
20f60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
20f70 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20  rms in subquery 
20f80 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
20f90 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e     pSrc = pParen
20fa0 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  t->pSrc;     /* 
20fb0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
20fc0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
20fd0 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20  /..    if( pSrc 
20fe0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20ff0 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20   pParent==p );  
21000 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68  /* First time th
21010 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
21020 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65  /.      jointype
21030 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e   = pSubitem->fg.
21040 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65  jointype;.    }e
21050 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
21060 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b  t( pParent!=p );
21070 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62    /* 2nd and sub
21080 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68  sequent times th
21090 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a  rough the loop *
210a0 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  /.      pSrc = p
210b0 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73  Parent->pSrc = s
210c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
210d0 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29  end(db, 0, 0, 0)
210e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63  ;.      if( pSrc
210f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
21100 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
21110 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
21120 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21130 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
21140 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  The subquery use
21150 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20  s a single slot 
21160 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
21170 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a  se of the outer.
21180 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49      ** query.  I
21190 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 68  f the subquery h
211a0 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  as more than one
211b0 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20   element in its 
211c0 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20  FROM clause,.   
211d0 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20   ** then expand 
211e0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
211f0 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f  to make space fo
21200 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  r it to hold all
21210 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a   elements.    **
21220 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
21230 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
21240 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
21250 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54      **    SELECT
21260 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53   * FROM tabA, (S
21270 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62  ELECT * FROM sub
21280 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a  1, sub2), tabB;.
21290 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
212a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
212b0 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73  s 3 slots in its
212c0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
212d0 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20  ne slot of the. 
212e0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
212f0 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c  y (the middle sl
21300 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20 74  ot) is used by t
21310 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68  he subquery.  Th
21320 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
21330 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c  ock of code will
21340 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
21350 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  r query FROM cla
21360 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e 0a  use to 4 slots..
21370 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64 6c      ** The middl
21380 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64  e slot is expand
21390 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20  ed to two slots 
213a0 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65  in order to make
213b0 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66 6f   space.    ** fo
213c0 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65 6e  r the two elemen
213d0 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ts in the FROM c
213e0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
213f0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
21400 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20    if( nSubSrc>1 
21410 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  ){.      pParent
21420 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20  ->pSrc = pSrc = 
21430 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
21440 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20  large(db, pSrc, 
21450 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b  nSubSrc-1,iFrom+
21460 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  1);.      if( db
21470 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
21480 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
21490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
214a0 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20      /* Transfer 
214b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
214c0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73  terms from the s
214d0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
214e0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
214f0 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ery..    */.    
21500 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53  for(i=0; i<nSubS
21510 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
21520 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
21530 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61 5b  ete(db, pSrc->a[
21540 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67 29  i+iFrom].pUsing)
21550 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21560 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
21570 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30  .fg.isTabFunc==0
21580 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e   );.      pSrc->
21590 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75  a[i+iFrom] = pSu
215a0 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  bSrc->a[i];.    
215b0 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 70    iNewParent = p
215c0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75  SubSrc->a[i].iCu
215d0 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d 73  rsor;.      mems
215e0 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69  et(&pSubSrc->a[i
215f0 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75  ], 0, sizeof(pSu
21600 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20  bSrc->a[i]));.  
21610 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b    }.    pSrc->a[
21620 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79  iFrom].fg.jointy
21630 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a 20  pe = jointype;. 
21640 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65 67   .    /* Now beg
21650 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67 20  in substituting 
21660 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 20  subquery result 
21670 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
21680 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66 65  for .    ** refe
21690 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69 50  rences to the iP
216a0 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75 74  arent in the out
216b0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  er query..    **
216c0 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65   .    ** Example
216d0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
216e0 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62 2a    SELECT a+5, b*
216f0 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  10 FROM (SELECT 
21700 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20 41  x*3 AS a, y+10 A
21710 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S b FROM t1) WHE
21720 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20 20  RE a>b;.    **  
21730 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   \              
21740 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
21750 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20 5f  _____ subquery _
21760 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
21770 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20 20      /.    **    
21780 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  \_______________
21790 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75 65  ______ outer que
217a0 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ry _____________
217b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
217c0 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  _/.    **.    **
217d0 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65 72   We look at ever
217e0 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  y expression in 
217f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
21800 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
21810 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22 61  we see.    ** "a
21820 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
21830 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79 20  "x*3" and every 
21840 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62 22  place we see "b"
21850 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20 22   we substitute "
21860 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  y+10"..    */.  
21870 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
21880 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a  erBy ){.      /*
21890 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
218a0 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72  any non-zero iOr
218b0 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73 20  derByCol values 
218c0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
218d0 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52  e.      ** ORDER
218e0 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65   BY column expre
218f0 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69 63  ssion is identic
21900 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65 72  al to the iOrder
21910 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20 2a  ByCol'th.      *
21920 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 74  * expression ret
21930 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20  urned by SELECT 
21940 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e 20  statement pSub. 
21950 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c 75  Since these valu
21960 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20 6e  es.      ** do n
21970 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 63  ot necessarily c
21980 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f 6c  orrespond to col
21990 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20 73  umns in SELECT s
219a0 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e 74  tatement pParent
219b0 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  ,.      ** zero 
219c0 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61 6e  them before tran
219d0 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44 45  sfering the ORDE
219e0 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
219f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
21a00 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d 61  ot doing this ma
21a10 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72  y cause an error
21a20 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
21a30 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
21a40 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
21a50 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
21a60 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  ten a compound s
21a70 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70 50  ub-query into pP
21a80 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 28  arent.      ** (
21a90 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 69  the only way thi
21aa0 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73 20  s can happen is 
21ab0 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  if the compound 
21ac0 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20 20  sub-query is.   
21ad0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20     ** currently 
21ae0 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70 53  part of pSub->pS
21af0 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74 20  rc). See ticket 
21b00 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20 2a  [d11a6e908f].  *
21b10 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
21b20 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75   *pOrderBy = pSu
21b30 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
21b40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f     for(i=0; i<pO
21b50 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
21b60 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 72  ++){.        pOr
21b70 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e  derBy->a[i].u.x.
21b80 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b  iOrderByCol = 0;
21b90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
21ba0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
21bb0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
21bc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
21bd0 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  b->pPrior==0 );.
21be0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
21bf0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
21c00 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
21c10 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
21c20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d    }.    pWhere =
21c30 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
21c40 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
21c50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73  , 0);.    if( is
21c60 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20  LeftJoin>0 ){.  
21c70 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
21c80 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65  pWhere, iNewPare
21c90 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
21ca0 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
21cb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
21cc0 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  ( pParent->pHavi
21cd0 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ng==0 );.      p
21ce0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
21cf0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  = pParent->pWher
21d00 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
21d10 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
21d20 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e;.      pParent
21d30 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
21d40 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 0a  te3ExprAnd(db, .
21d50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21d60 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
21d70 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 2c 20  b->pHaving, 0), 
21d80 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
21d90 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
21da0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
21db0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
21dc0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
21dd0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
21de0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
21df0 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
21e00 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
21e10 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
21e20 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
21e30 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72  xprAnd(db, pWher
21e40 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  e, pParent->pWhe
21e50 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  re);.    }.    i
21e60 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
21e70 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  led==0 ){.      
21e80 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a  SubstContext x;.
21e90 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
21ea0 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
21eb0 2e 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e  .iTable = iParen
21ec0 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  t;.      x.iNewT
21ed0 61 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e  able = iNewParen
21ee0 74 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66  t;.      x.isLef
21ef0 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f  tJoin = isLeftJo
21f00 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69  in;.      x.pELi
21f10 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73  st = pSub->pELis
21f20 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  t;.      substSe
21f30 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74  lect(&x, pParent
21f40 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
21f50 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65     /* The flatte
21f60 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73  ned query is dis
21f70 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20  tinct if either 
21f80 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65  the inner or the
21f90 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
21fa0 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e  ery is distinct.
21fb0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61   .    */.    pPa
21fc0 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  rent->selFlags |
21fd0 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  = pSub->selFlags
21fe0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a   & SF_Distinct;.
21ff0 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a    .    /*.    **
22000 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
22010 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d   (SELECT ... LIM
22020 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c  IT a OFFSET b) L
22030 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b  IMIT x OFFSET y;
22040 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
22050 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f  ne is tempted to
22060 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e   try to add a an
22070 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74  d b to combine t
22080 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20  he limits.  But 
22090 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73  this.    ** does
220a0 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74   not work if eit
220b0 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  her limit is neg
220c0 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
220d0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
220e0 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  it ){.      pPar
220f0 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53  ent->pLimit = pS
22100 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20  ub->pLimit;.    
22110 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d    pSub->pLimit =
22120 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
22130 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65   /* Finially, de
22140 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66  lete what is lef
22150 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
22160 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  y and return.  *
22170 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a  * success..  */.
22180 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
22190 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29  elete(db, pSub1)
221a0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
221b0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
221c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
221d0 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20  ace & 0x100 ){. 
221e0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
221f0 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x100,pParse,p,("
22200 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67  After flattening
22210 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
22220 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
22230 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
22240 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
22250 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
22260 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
22270 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
22280 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
22290 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
222a0 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
222b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
222c0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
222d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
222e0 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63  EW)./*.** Make c
222f0 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e  opies of relevan
22300 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
22310 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65  erms of the oute
22320 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20  r query into.** 
22330 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
22340 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45   of subquery.  E
22350 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
22360 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
22370 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63  SELECT a AS x, c
22380 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29  -d AS y FROM t1)
22390 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
223a0 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73  =10;.**.** Trans
223b0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a  formed into:.**.
223c0 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
223d0 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
223e0 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
223f0 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41  M t1 WHERE a=5 A
22400 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20  ND c-d=10).**   
22410 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20    WHERE x=5 AND 
22420 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  y=10;.**.** The 
22430 68 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65  hope is that the
22440 20 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20   terms added to 
22450 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  the inner query 
22460 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72  will make it mor
22470 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a  e.** efficient..
22480 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  **.** Do not att
22490 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69  empt this optimi
224a0 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  zation if:.**.**
224b0 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72     (1) The inner
224c0 20 71 75 65 72 79 20 69 73 20 61 6e 20 61 67 67   query is an agg
224d0 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61  regate.  (In tha
224e0 74 20 63 61 73 65 2c 20 77 65 27 64 20 72 65 61  t case, we'd rea
224f0 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20  lly want.**     
22500 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75    to copy the ou
22510 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
22520 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
22530 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66  HAVING clause of
22540 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e   the.**       in
22550 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20  ner query.  But 
22560 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f  they probably wo
22570 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65 20 73  n't help there s
22580 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e  o do not bother.
22590 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68  ).**.**   (2) Th
225a0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73  e inner query is
225b0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
225c0 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20  art of a common 
225d0 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
225e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68  ..**.**   (3) Th
225f0 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61  e inner query ha
22600 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  s a LIMIT clause
22610 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e   (since the chan
22620 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  ges to the WHERE
22630 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20  .**       close 
22640 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
22650 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
22660 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
22670 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
22680 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
22690 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
226a0 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63  FT JOIN.  (The c
226b0 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65  aller.**       e
226c0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72 65 73  nforces this res
226d0 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74  triction since t
226e0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
226f0 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68   not have enough
22700 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d  .**       inform
22710 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a  ation to know.).
22720 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20  **.**   (5) The 
22730 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
22740 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74  ression originat
22750 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20  es in the ON or 
22760 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20  USING clause.** 
22770 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20        of a LEFT 
22780 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  JOIN..**.** Retu
22790 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67  rn 0 if no chang
227a0 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20  es are made and 
227b0 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20  non-zero if one 
227c0 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c  or more WHERE cl
227d0 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72  ause.** terms ar
227e0 65 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74  e duplicated int
227f0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  o the subquery..
22800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75  */.static int pu
22810 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
22820 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
22830 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
22840 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20  se context (for 
22850 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72  malloc() and err
22860 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f  or reporting) */
22870 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
22880 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
22890 73 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57  subquery whose W
228a0 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
228b0 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a  o be augmented *
228c0 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
228d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
228e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
228f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
22900 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f   */.  int iCurso
22910 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  r           /* C
22920 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
22930 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
22940 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
22950 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
22960 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20  ;.  Select *pX; 
22970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
22980 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 63 6f   looping over co
22990 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 69  mpound SELECTs i
229a0 6e 20 70 53 75 62 71 20 2a 2f 0a 20 20 69 66 28  n pSubq */.  if(
229b0 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74   pWhere==0 ) ret
229c0 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70 58 3d  urn 0;.  for(pX=
229d0 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58  pSubq; pX; pX=pX
229e0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69  ->pPrior){.    i
229f0 66 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73  f( (pX->selFlags
22a00 20 26 20 28 53 46 5f 41 67 67 72 65 67 61 74 65   & (SF_Aggregate
22a10 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 21  |SF_Recursive))!
22a20 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
22a30 63 61 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c 61  case( pX->selFla
22a40 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
22a50 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
22a60 61 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c 61 67  ase( pX->selFlag
22a70 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
22a80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
22a90 73 65 28 20 70 58 21 3d 70 53 75 62 71 20 29 3b  se( pX!=pSubq );
22aa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
22ab0 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73   /* restrictions
22ac0 20 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a   (1) and (2) */.
22ad0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
22ae0 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
22af0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
22b00 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
22b10 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68   (3) */.  }.  wh
22b20 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
22b30 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e  =TK_AND ){.    n
22b40 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e  Chng += pushDown
22b50 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
22b60 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  e, pSubq, pWhere
22b70 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f  ->pRight, iCurso
22b80 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d  r);.    pWhere =
22b90 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a   pWhere->pLeft;.
22ba0 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61    }.  if( ExprHa
22bb0 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65  sProperty(pWhere
22bc0 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20  ,EP_FromJoin) ) 
22bd0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
22be0 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20  triction 5 */.  
22bf0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
22c00 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
22c10 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20  Where, iCursor) 
22c20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a  ){.    nChng++;.
22c30 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71      while( pSubq
22c40 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
22c50 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
22c60 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
22c70 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
22c80 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
22c90 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70      x.pParse = p
22ca0 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69  Parse;.      x.i
22cb0 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b  Table = iCursor;
22cc0 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62  .      x.iNewTab
22cd0 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
22ce0 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e      x.isLeftJoin
22cf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45   = 0;.      x.pE
22d00 4c 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45  List = pSubq->pE
22d10 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  List;.      pNew
22d20 20 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c   = substExpr(&x,
22d30 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 53   pNew);.      pS
22d40 75 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71  ubq->pWhere = sq
22d50 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61  lite3ExprAnd(pPa
22d60 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e  rse->db, pSubq->
22d70 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
22d80 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75       pSubq = pSu
22d90 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  bq->pPrior;.    
22da0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
22db0 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Chng;.}.#endif /
22dc0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
22dd0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
22de0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
22df0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
22e00 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f  /../*.** Based o
22e10 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
22e20 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  f the AggInfo st
22e30 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
22e40 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a  d by the first.*
22e50 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73  * argument, this
22e60 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
22e70 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
22e80 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
22e90 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79  *    * the query
22ea0 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61   contains just a
22eb0 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74   single aggregat
22ec0 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20  e function,.**  
22ed0 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74    * the aggregat
22ee0 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69  e function is ei
22ef0 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61  ther min() or ma
22f00 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a  x(), and.**    *
22f10 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
22f20 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
22f30 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c  unction is a col
22f40 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  umn value..**.**
22f50 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61   If all of the a
22f60 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74  bove are true, t
22f70 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42  hen WHERE_ORDERB
22f80 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f  Y_MIN or WHERE_O
22f90 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73  RDERBY_MAX.** is
22fa0 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70   returned as app
22fb0 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20  ropriate. Also, 
22fc0 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
22fd0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
22fe0 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67   .** list of arg
22ff0 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
23000 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62   the aggregate b
23010 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
23020 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
23030 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  e conditions abo
23040 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20  ve are not met, 
23050 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74  *ppMinMax is set
23060 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45   to 0 and.** WHE
23070 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
23080 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
23090 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d  /.static u8 minM
230a0 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20  axQuery(AggInfo 
230b0 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c  *pAggInfo, ExprL
230c0 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
230d0 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
230e0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
230f0 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  AL;          /* 
23100 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
23110 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30  .  *ppMinMax = 0
23120 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f  ;.  if( pAggInfo
23130 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20  ->nFunc==1 ){.  
23140 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
23150 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
23160 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67  0].pExpr; /* Agg
23170 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
23180 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  */.    ExprList 
23190 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d  *pEList = pExpr-
231a0 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f  >x.pList;      /
231b0 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
231c0 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  gg function */..
231d0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
231e0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  r->op==TK_AGG_FU
231f0 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66  NCTION );.    if
23200 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
23210 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20  st->nExpr==1 && 
23220 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
23230 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43  pr->op==TK_AGG_C
23240 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63  OLUMN ){.      c
23250 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
23260 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
23270 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  en;.      if( sq
23280 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
23290 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
232a0 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
232b0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
232c0 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  N;.        *ppMi
232d0 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
232e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
232f0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
23300 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29  unc, "max")==0 )
23310 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
23320 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
23330 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  AX;.        *ppM
23340 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
23350 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23360 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  }..  assert( *pp
23370 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70  MinMax==0 || (*p
23380 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d  pMinMax)->nExpr=
23390 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  =1 );.  return e
233a0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
233b0 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
233c0 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
233d0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
233e0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
233f0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
23400 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
23410 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
23420 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
23430 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
23440 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
23450 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
23460 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
23470 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
23480 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
23490 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
234a0 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
234b0 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
234c0 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
234d0 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
234e0 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
234f0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
23500 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
23510 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
23520 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
23530 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
23540 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
23550 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
23560 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
23570 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
23580 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
23590 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
235a0 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
235b0 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
235c0 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
235d0 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
235e0 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
235f0 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
23600 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
23610 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
23620 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
23630 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
23640 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
23650 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
23660 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
23670 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
23680 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
23690 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
236a0 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
236b0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
236c0 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
236d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
236e0 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
236f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
23700 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
23710 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
23720 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
23730 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
23740 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
23750 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
23760 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
23770 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
23780 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
23790 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
237a0 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
237b0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
237c0 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
237d0 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
237e0 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
237f0 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
23800 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
23810 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
23820 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
23830 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
23840 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
23850 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
23860 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
23870 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
23880 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
23890 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
238a0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
238b0 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
238c0 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
238d0 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
238e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
238f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
23900 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
23910 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
23920 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
23930 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
23940 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
23950 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  From->fg.isIndex
23960 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  edBy ){.    Tabl
23970 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
23980 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
23990 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46  *zIndexedBy = pF
239a0 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  rom->u1.zIndexed
239b0 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  By;.    Index *p
239c0 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
239d0 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
239e0 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
239f0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
23a00 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
23a10 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20  dexedBy); .     
23a20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
23a30 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
23a40 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
23a50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23a60 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
23a70 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
23a80 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20  IndexedBy, 0);. 
23a90 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
23aa0 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
23ab0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23ac0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
23ad0 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64     pFrom->pIBInd
23ae0 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
23af0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23b00 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
23b10 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
23b20 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
23b30 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
23b40 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
23b50 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
23b60 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
23b70 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
23b80 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
23b90 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
23ba0 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
23bb0 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
23bc0 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
23bd0 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
23be0 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
23bf0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
23c00 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
23c10 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
23c20 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
23c30 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
23c40 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
23c50 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
23c60 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
23c70 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
23c80 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
23c90 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
23ca0 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
23cb0 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
23cc0 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
23cd0 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
23ce0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23cf0 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
23d00 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
23d10 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
23d20 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
23d30 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
23d40 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
23d50 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
23d60 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
23d70 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
23d80 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
23d90 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
23da0 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
23db0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
23dc0 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
23dd0 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
23de0 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
23df0 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
23e00 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
23e10 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
23e20 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
23e30 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
23e40 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
23e50 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
23e60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23e70 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
23e80 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
23e90 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
23ea0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
23eb0 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
23ec0 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
23ed0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
23ee0 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
23ef0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
23f00 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
23f10 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
23f20 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
23f30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
23f40 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
23f50 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
23f60 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
23f70 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
23f80 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
23f90 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
23fa0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
23fb0 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
23fc0 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
23fd0 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
23fe0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23ff0 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
24000 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
24010 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
24020 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
24030 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
24040 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
24050 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
24060 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
24070 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
24080 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
24090 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
240a0 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
240b0 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
240c0 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
240d0 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
240e0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
240f0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
24100 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
24110 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
24120 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
24130 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
24140 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
24150 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
24160 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
24170 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
24180 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
24190 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
241a0 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
241b0 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
241c0 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
241d0 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
241e0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
241f0 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
24200 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
24210 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
24220 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
24230 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
24240 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
24250 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a  _ASTERISK, 0));.
24260 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
24270 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
24280 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
24290 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
242a0 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
242b0 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
242c0 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
242d0 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65  or = 0;.  p->pNe
242e0 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69  xt = 0;.  p->pWi
242f0 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c  th = 0;.  p->sel
24300 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
24310 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  pound;.  assert(
24320 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
24330 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30  SF_Converted)==0
24340 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
24350 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65  s |= SF_Converte
24360 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
24370 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
24380 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
24390 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
243a0 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
243b0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
243c0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
243d0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
243e0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
243f0 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20  see if the FROM 
24400 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f  clause term pFro
24410 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75  m has table-valu
24420 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  ed function.** a
24430 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74  rguments.  If it
24440 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20   does, leave an 
24450 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
24460 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
24470 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
24480 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e  since pFrom is n
24490 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
244a0 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20   a table-valued 
244b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
244c0 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65  tic int cannotBe
244d0 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
244e0 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
244f0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
24500 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
24510 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
24520 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
24530 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27  orMsg(pParse, "'
24540 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e  %s' is not a fun
24550 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a  ction", pFrom->z
24560 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
24570 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
24580 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
24590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
245a0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
245b0 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
245c0 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
245d0 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
245e0 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
245f0 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
24600 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
24610 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
24620 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
24630 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
24640 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
24650 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
24660 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
24670 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
24680 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
24690 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
246a0 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
246b0 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
246c0 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
246d0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
246e0 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
246f0 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
24700 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
24710 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
24720 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
24730 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
24740 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
24750 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
24760 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
24770 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24790 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d  * Current innerm
247a0 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
247b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
247c0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
247d0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
247e0 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
247f0 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
24800 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
24810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24820 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
24830 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
24840 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
24850 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
24860 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
24870 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
24880 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
24890 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
248a0 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
248b0 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
248c0 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
248d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
248e0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
248f0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
24900 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
24910 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
24920 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
24930 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
24940 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
24950 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
24960 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
24970 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24980 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
24990 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
249a0 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
249b0 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
249c0 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
249d0 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
249e0 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
249f0 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
24a00 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
24a10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
24a20 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
24a30 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
24a40 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
24a50 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
24a60 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
24a70 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
24a80 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
24a90 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
24aa0 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
24ab0 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
24ac0 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
24ad0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
24ae0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
24af0 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
24b00 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
24b10 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
24b20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
24b30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
24b40 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
24b50 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
24b60 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
24b70 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
24b80 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
24b90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24ba0 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
24bb0 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
24bc0 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
24bd0 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
24be0 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70  =0 || (pParse->p
24bf0 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73  With==0 && pPars
24c00 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d  e->pWithToFree==
24c10 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  0) );.  if( pWit
24c20 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
24c30 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d   pParse->pWith!=
24c40 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69  pWith );.    pWi
24c50 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
24c60 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
24c70 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
24c80 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
24c90 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70  Free ) pParse->p
24ca0 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69  WithToFree = pWi
24cb0 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  th;.  }.}../*.**
24cc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
24cd0 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e  hecks if argumen
24ce0 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74  t pFrom refers t
24cf0 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64  o a CTE declared
24d00 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63   by .** a WITH c
24d10 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61  lause on the sta
24d20 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69  ck currently mai
24d30 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70  ntained by the p
24d40 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69  arser. And,.** i
24d50 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
24d60 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70  essing a CTE exp
24d70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69  ression, if it i
24d80 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  s a recursive.**
24d90 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
24da0 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a  e current CTE..*
24db0 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61  *.** If pFrom fa
24dc0 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20  lls into either 
24dd0 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67  of the two categ
24de0 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72  ories above, pFr
24df0 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20  om->pTab.** and 
24e00 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
24e10 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72   populated accor
24e20 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c  dingly. The call
24e30 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a  er should check.
24e40 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21  ** (pFrom->pTab!
24e50 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  =0) to determine
24e60 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
24e70 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74  a successful mat
24e80 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e  ch.** was found.
24e90 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
24ea0 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73  r not a match is
24eb0 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f   found, SQLITE_O
24ec0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
24ed0 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   no error.** occ
24ee0 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
24ef0 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
24f00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
24f10 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
24f20 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d  * parser and som
24f30 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
24f40 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
24f50 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
24f60 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78  tatic int withEx
24f70 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a  pand(.  Walker *
24f80 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75  pWalker, .  stru
24f90 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24fa0 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73  *pFrom.){.  Pars
24fb0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
24fc0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
24fd0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
24fe0 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63  rse->db;.  struc
24ff0 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20  t Cte *pCte;    
25000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
25010 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55  tched CTE (or NU
25020 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20  LL if no match) 
25030 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
25040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25050 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61       /* WITH cla
25060 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65  use that pCte be
25070 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
25080 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
25090 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65  ab==0 );..  pCte
250a0 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50   = searchWith(pP
250b0 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72  arse->pWith, pFr
250c0 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69  om, &pWith);.  i
250d0 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54  f( pCte ){.    T
250e0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
250f0 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
25100 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
25110 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  el;.    Select *
25120 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
25130 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
25140 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
25150 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ent */.    int b
25160 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20  MayRecursive;   
25170 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
25180 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69   if compound joi
25190 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c  ned by UNION [AL
251a0 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a  L] */.    With *
251b0 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20  pSavedWith;     
251c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
251d0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72  al value of pPar
251e0 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20  se->pWith */..  
251f0 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43    /* If pCte->zC
25200 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  teErr is non-NUL
25210 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
25220 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
25230 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
25240 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
25250 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
25260 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
25270 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
25280 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
25290 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  y. If pCte->zCte
252a0 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
252b0 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
252c0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
252d0 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
252e0 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
252f0 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
25300 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a  Cte->zCteErr ){.
25310 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25320 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
25330 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74  te->zCteErr, pCt
25340 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
25350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
25360 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
25370 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  if( cannotBeFunc
25380 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72  tion(pParse, pFr
25390 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  om) ) return SQL
253a0 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  ITE_ERROR;..    
253b0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
253c0 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
253d0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
253e0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
253f0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
25400 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
25410 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
25420 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
25430 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
25440 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
25450 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
25460 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
25470 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
25480 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
25490 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
254a0 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
254b0 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
254c0 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
254d0 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
254e0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
254f0 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73  meral | TF_NoVis
25500 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70  ibleRowid;.    p
25510 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
25520 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
25530 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
25540 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
25550 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
25560 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
25570 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
25580 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
25590 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
255a0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
255b0 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
255c0 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
255d0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
255e0 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
255f0 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
25600 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
25610 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
25620 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
25630 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
25640 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
25650 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
25660 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
25670 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
25680 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
25690 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
256a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
256b0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
256c0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
256d0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
256e0 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
256f0 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
25700 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
25710 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
25720 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
25730 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
25740 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
25750 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
25760 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
25770 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
25780 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  isRecursive = 1;
25790 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
257a0 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
257b0 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
257c0 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
257d0 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
257e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
257f0 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
25800 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
25810 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
25820 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
25830 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a  b->nTabRef>2 ){.
25840 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25850 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20  orMsg(.         
25860 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70   pParse, "multip
25870 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
25880 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
25890 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61  : %s", pCte->zNa
258a0 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
258b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
258c0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
258d0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
258e0 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70  TabRef==1 || ((p
258f0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
25900 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
25910 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20  Tab->nTabRef==2 
25920 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a  ));..    pCte->z
25930 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c  CteErr = "circul
25940 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73  ar reference: %s
25950 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74  ";.    pSavedWit
25960 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  h = pParse->pWit
25970 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
25980 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
25990 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
259a0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ive ){.      Sel
259b0 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53  ect *pPrior = pS
259c0 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  el->pPrior;.    
259d0 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
259e0 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
259f0 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74      pPrior->pWit
25a00 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b  h = pSel->pWith;
25a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
25a20 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
25a30 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20  , pPrior);.     
25a40 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
25a50 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
25a60 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25a70 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
25a80 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
25a90 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
25aa0 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72   pWith;..    for
25ab0 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65  (pLeft=pSel; pLe
25ac0 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66  ft->pPrior; pLef
25ad0 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29  t=pLeft->pPrior)
25ae0 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
25af0 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Left->pEList;.  
25b00 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c    if( pCte->pCol
25b10 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  s ){.      if( p
25b20 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
25b30 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
25b40 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
25b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25b60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
25b70 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
25b80 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
25b90 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
25ba0 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
25bb0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
25bc0 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
25bd0 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
25be0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
25bf0 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
25c00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25c10 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25c20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
25c30 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
25c40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
25c50 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
25c60 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
25c70 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
25c80 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
25c90 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
25ca0 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
25cb0 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46    if( pSel->selF
25cc0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
25cd0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ive ){.        p
25ce0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
25cf0 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69  multiple recursi
25d00 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25  ve references: %
25d10 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s";.      }else{
25d20 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
25d30 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73  CteErr = "recurs
25d40 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e  ive reference in
25d50 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22   a subquery: %s"
25d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25d70 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25d80 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
25d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65  ;.    }.    pCte
25da0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ->zCteErr = 0;. 
25db0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
25dc0 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20   = pSavedWith;. 
25dd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
25de0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
25df0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25e00 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20  _OMIT_CTE./*.** 
25e10 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61  If the SELECT pa
25e20 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
25e30 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  nd argument has 
25e40 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49  an associated WI
25e50 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70  TH .** clause, p
25e60 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73  op it from the s
25e70 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70  tack stored as p
25e80 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65  art of the Parse
25e90 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
25ea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25eb0 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c  used as the xSel
25ec0 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63  ectCallback2() c
25ed0 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71  allback by.** sq
25ee0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
25ef0 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67  d() when walking
25f00 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74   a SELECT tree t
25f10 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a  o resolve table.
25f20 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68  ** names and oth
25f30 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  er FROM clause e
25f40 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61  lements. .*/.sta
25f50 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50  tic void selectP
25f60 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70  opWith(Walker *p
25f70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
25f80 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
25f90 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
25fa0 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61  Parse;.  if( pPa
25fb0 72 73 65 2d 3e 70 57 69 74 68 20 26 26 20 70 2d  rse->pWith && p-
25fc0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
25fd0 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
25fe0 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
25ff0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  ->pWith;.    if(
26000 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20   pWith!=0 ){.   
26010 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
26020 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20  e->pWith==pWith 
26030 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
26040 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
26050 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pOuter;.    }.  
26060 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
26070 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
26080 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
26090 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
260a0 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
260b0 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
260c0 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
260d0 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
260e0 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
260f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
26100 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
26110 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
26120 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
26130 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
26140 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
26150 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
26160 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
26170 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
26180 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
26190 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
261a0 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
261b0 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
261c0 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
261d0 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
261e0 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
261f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
26200 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
26210 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
26220 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
26230 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
26240 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
26250 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
26260 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
26270 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
26280 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
26290 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
262a0 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
262b0 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
262c0 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
262d0 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
262e0 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
262f0 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
26300 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
26310 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
26320 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
26330 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
26340 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
26350 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
26360 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
26370 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
26380 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
26390 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
263a0 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
263b0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
263c0 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
263d0 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
263e0 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
263f0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
26400 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
26410 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
26420 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
26430 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
26440 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
26450 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
26460 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
26470 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
26480 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
26490 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
264a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
264b0 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
264c0 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
264d0 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
264e0 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
264f0 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
26500 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
26510 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
26520 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
26530 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
26540 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
26550 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
26560 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
26570 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
26580 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
26590 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
265a0 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
265b0 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
265c0 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
265d0 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
265e0 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ;..  p->selFlags
265f0 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b   |= SF_Expanded;
26600 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
26610 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20  cFailed  ){.    
26620 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
26630 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
26640 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c  R(p->pSrc==0) ||
26650 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f   (selFlags & SF_
26660 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
26670 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
26680 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rune;.  }.  pTab
26690 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
266a0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
266b0 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  List;.  if( p->p
266c0 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69  With ){.    sqli
266d0 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
266e0 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29  se, p->pWith, 0)
266f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
26700 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
26710 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
26720 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
26730 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
26740 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
26750 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
26760 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
26770 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
26780 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
26790 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
267a0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
267b0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
267c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
267d0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
267e0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
267f0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
26800 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
26810 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
26820 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
26830 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
26840 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
26850 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
26860 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
26870 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
26880 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
26890 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
268a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
268b0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
268c0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
268d0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67  ssert( pFrom->fg
268e0 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  .isRecursive==0 
268f0 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  || pFrom->pTab!=
26900 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72  0 );.    if( pFr
26910 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69  om->fg.isRecursi
26920 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ve ) continue;. 
26930 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26940 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66  ->pTab==0 );.#if
26950 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26960 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74  _CTE.    if( wit
26970 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c  hExpand(pWalker,
26980 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
26990 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
269a0 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
269b0 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66  ) {} else.#endif
269c0 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
269d0 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e  zName==0 ){.#ifn
269e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
269f0 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53  SUBQUERY.      S
26a00 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
26a10 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
26a20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
26a30 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
26a40 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
26a50 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  T */.      asser
26a60 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20  t( pSel!=0 );.  
26a70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
26a80 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
26a90 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
26aa0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
26ab0 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72  r, pSel) ) retur
26ac0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
26ad0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
26ae0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
26af0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
26b00 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
26b10 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
26b20 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
26b30 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
26b40 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
26b50 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
26b60 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
26b70 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71  f(db, "sqlite_sq
26b80 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61  _%p", (void*)pTa
26b90 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  b);.      while(
26ba0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b   pSel->pPrior ){
26bb0 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
26bc0 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71  rior; }.      sq
26bd0 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
26be0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
26bf0 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70   pSel->pEList,&p
26c00 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d  Tab->nCol,&pTab-
26c10 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54  >aCol);.      pT
26c20 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
26c30 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77        pTab->nRow
26c40 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
26c50 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
26c60 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
26c70 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ) );.      pTab-
26c80 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
26c90 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69  Ephemeral;.#endi
26ca0 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
26cb0 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72     /* An ordinar
26cc0 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  y table or view 
26cd0 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  name in the FROM
26ce0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
26cf0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
26d00 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
26d10 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
26d20 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
26d30 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
26d40 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a  rse, 0, pFrom);.
26d50 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
26d60 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
26d70 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  bort;.      if( 
26d80 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30  pTab->nTabRef>=0
26d90 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20  xffff ){.       
26da0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26db0 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
26dc0 6e 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ny references to
26dd0 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35   \"%s\": max 655
26de0 33 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  35",.           
26df0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
26e00 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
26e10 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  b = 0;.        r
26e20 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
26e40 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
26e50 20 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72        if( !IsVir
26e60 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61  tual(pTab) && ca
26e70 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70  nnotBeFunction(p
26e80 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b  Parse, pFrom) ){
26e90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26ea0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26eb0 20 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28   }.#if !defined(
26ec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
26ed0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53  ) || !defined (S
26ee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
26ef0 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69  ALTABLE).      i
26f00 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
26f10 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  b) || pTab->pSel
26f20 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
26f30 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16 nCol;.       
26f40 20 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77   if( sqlite3View
26f50 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
26f60 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72  Parse, pTab) ) r
26f70 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26f80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26f90 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d   pFrom->pSelect=
26fa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46  =0 );.        pF
26fb0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
26fc0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
26fd0 64 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  db, pTab->pSelec
26fe0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  t, 0);.        s
26ff0 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e  qlite3SelectSetN
27000 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  ame(pFrom->pSele
27010 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ct, pTab->zName)
27020 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d  ;.        nCol =
27030 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20   pTab->nCol;.   
27040 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
27050 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71  = -1;.        sq
27060 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
27070 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
27080 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
27090 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e    pTab->nCol = n
270a0 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Col;.      }.#en
270b0 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
270c0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  * Locate the ind
270d0 65 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  ex named by the 
270e0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
270f0 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20  e, if any. */.  
27100 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64    if( sqlite3Ind
27110 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61  exedByLookup(pPa
27120 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20  rse, pFrom) ){. 
27130 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
27140 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
27150 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e  ..  /* Process N
27160 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c  ATURAL keywords,
27170 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e   and ON and USIN
27180 47 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69  G clauses of joi
27190 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ns..  */.  if( d
271a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
271b0 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  || sqliteProcess
271c0 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20  Join(pParse, p) 
271d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
271e0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
271f0 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22  /* For every "*"
27200 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
27210 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c  the column list,
27220 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
27230 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f  s of.  ** all co
27240 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62  lumns in all tab
27250 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76  les.  And for ev
27260 65 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65  ery TABLE.* inse
27270 72 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a  rt the names.  *
27280 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  * of all columns
27290 20 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20   in TABLE.  The 
272a0 70 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20  parser inserted 
272b0 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
272c0 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74  sion.  ** with t
272d0 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f  he TK_ASTERISK o
272e0 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
272f0 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
27300 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
27310 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65  .  ** list.  The
27320 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
27330 6a 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61  just has to loca
27340 74 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49  te the TK_ASTERI
27350 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  SK.  ** expressi
27360 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65  ons and expand e
27370 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
27380 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
27390 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74  ns in.  ** all t
273a0 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ables..  **.  **
273b0 20 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20   The first loop 
273c0 6a 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73  just checks to s
273d0 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ee if there are 
273e0 61 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  any "*" operator
273f0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64  s.  ** that need
27400 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f   expanding..  */
27410 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45  .  for(k=0; k<pE
27420 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b  List->nExpr; k++
27430 29 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69  ){.    pE = pELi
27440 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
27450 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
27460 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
27470 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
27480 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
27490 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
274a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
274b0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
274c0 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
274d0 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
274e0 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
274f0 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
27500 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
27510 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53  ->op==TK_ASTERIS
27520 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  K ) break;.  }. 
27530 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
27540 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
27550 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
27560 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
27570 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
27580 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
27590 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
275a0 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
275b0 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
275c0 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
275d0 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
275e0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
275f0 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
27600 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
27610 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
27620 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
27630 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
27640 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
27650 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
27660 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
27670 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
27680 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
27690 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
276a0 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
276b0 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
276c0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c            && (fl
276d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
276e0 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
276f0 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
27700 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
27710 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20  ++){.      pE = 
27720 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
27730 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70    pRight = pE->p
27740 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
27750 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
27760 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30  DOT || pRight!=0
27770 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
27780 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53  ->op!=TK_ASTERIS
27790 4b 0a 20 20 20 20 20 20 20 26 26 20 28 70 45 2d  K.       && (pE-
277a0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
277b0 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53  Right->op!=TK_AS
277c0 54 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b  TERISK).      ){
277d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
277e0 20 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72   particular expr
277f0 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ession does not 
27800 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
27810 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ded..        */.
27820 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73          pNew = s
27830 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
27840 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65  pend(pParse, pNe
27850 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a  w, a[k].pExpr);.
27860 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
27870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
27880 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
27890 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b  r-1].zName = a[k
278a0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
278b0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
278c0 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20  >nExpr-1].zSpan 
278d0 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20  = a[k].zSpan;.  
278e0 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
278f0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
27900 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30    a[k].zSpan = 0
27910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27920 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d      a[k].pExpr =
27930 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
27940 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
27950 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
27960 20 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45   "*" or a "TABLE
27970 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  .*" and needs to
27980 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   be.        ** e
27990 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  xpanded. */.    
279a0 20 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65      int tableSee
279b0 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  n = 0;      /* S
279c0 65 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42  et to 1 when TAB
279d0 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  LE matches */.  
279e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61        char *zTNa
279f0 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
27a00 20 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66   text of name of
27a10 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20   TABLE */.      
27a20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
27a30 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
27a40 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c    assert( pE->pL
27a50 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  eft!=0 );.      
27a60 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
27a70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d  rHasProperty(pE-
27a80 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61  >pLeft, EP_IntVa
27a90 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
27aa0 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70    zTName = pE->p
27ab0 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
27ac0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27ad0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
27ae0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
27af0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
27b00 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
27b10 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
27b20 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
27b30 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65  ab;.          Se
27b40 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72  lect *pSub = pFr
27b50 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
27b60 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
27b70 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
27b80 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
27b90 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
27ba0 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  hemaName = 0;.  
27bb0 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
27bc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
27bd0 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TabName==0 ){.  
27be0 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
27bf0 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
27c00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27c10 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
27c20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
27c30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
27c40 69 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28  if( pSub==0 || (
27c50 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
27c60 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d   SF_NestedFrom)=
27c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27c80 20 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20    pSub = 0;.    
27c90 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
27ca0 6d 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  me && sqlite3Str
27cb0 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61  ICmp(zTName, zTa
27cc0 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  bName)!=0 ){.   
27cd0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
27ce0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
27cf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
27d00 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
27d10 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
27d20 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
27d30 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d            zSchem
27d40 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f  aName = iDb>=0 ?
27d50 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44   db->aDb[iDb].zD
27d60 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20  bSName : "*";.  
27d70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27d80 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
27d90 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
27da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
27db0 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
27dc0 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
27de0 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20   *zColname;  /* 
27df0 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c  The computed col
27e00 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
27e10 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
27e20 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c  oFree;   /* Mall
27e30 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74  oced string that
27e40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
27e50 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
27e60 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65    Token sColname
27e70 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63  ;  /* Computed c
27e80 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20  olumn name as a 
27e90 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  token */..      
27ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e        assert( zN
27eb0 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ame );.         
27ec0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
27ed0 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20   pSub.          
27ee0 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74     && sqlite3Mat
27ef0 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d  chSpanName(pSub-
27f00 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
27f10 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20  pan, 0, zTName, 
27f20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
27f30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
27f40 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
27f50 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
27f60 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
27f70 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
27f80 20 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d   as 'hidden', om
27f90 69 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65  it it from the e
27fa0 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
27fb0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
27fc0 74 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68  t list unless th
27fd0 65 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65  e SELECT has the
27fe0 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65   SF_IncludeHidde
27ff0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
28000 20 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20   bit set..      
28010 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28020 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c       if( (p->sel
28030 46 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75  Flags & SF_Inclu
28040 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20  deHidden)==0.   
28050 20 20 20 20 20 20 20 20 20 20 26 26 20 49 73 48            && IsH
28060 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61  iddenColumn(&pTa
28070 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20  b->aCol[j]) .   
28080 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
28090 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
280a0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
280b0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61  }.            ta
280c0 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20  bleSeen = 1;..  
280d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
280e0 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29  0 && zTName==0 )
280f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28100 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a  if( (pFrom->fg.j
28110 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
28120 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20  URAL)!=0.       
28130 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c           && tabl
28140 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
28150 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61  pTabList, i, zNa
28160 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20  me, 0, 0).      
28170 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
28180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28190 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
281a0 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
281b0 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
281c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
281d0 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65   ** table to the
281e0 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f   right of the jo
281f0 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  in */.          
28200 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
28210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
28230 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
28240 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69  ndex(pFrom->pUsi
28250 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
28260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28270 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
28280 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
28290 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
282a0 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
282b0 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
282c0 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
282d0 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
282e0 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
282f0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
28300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
28310 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28320 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
28330 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
28340 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
28350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
28360 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
28370 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
28380 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
28390 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
283a0 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
283b0 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
283c0 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
283d0 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
283e0 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
283f0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
28400 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
28410 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
28420 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
28430 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
28440 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
28450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
28460 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29  f( zSchemaName )
28470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28480 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    pLeft = sqlite
28490 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
284a0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20   zSchemaName);. 
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
284c0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
284d0 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
284e0 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72  OT, pLeft, pExpr
284f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
28500 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
28510 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
28520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28530 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
28540 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
28550 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
28560 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
28570 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
28580 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
285a0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
285b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
285c0 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
285d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
285e0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
285f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
28600 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
28610 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
28620 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28630 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e  TokenInit(&sColn
28640 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a  ame, zColname);.
28650 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28660 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
28670 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  me(pParse, pNew,
28680 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a   &sColname, 0);.
28690 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
286a0 70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46  pNew && (p->selF
286b0 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
286c0 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20  From)!=0 ){.    
286d0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
286e0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
286f0 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e  pX = &pNew->a[pN
28700 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  ew->nExpr-1];.  
28710 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28720 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
28730 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61          pX->zSpa
28740 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
28750 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  Dup(db, pSub->pE
28760 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
28770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
28780 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
28790 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
287a0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
287b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
287c0 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
287d0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
287e0 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20   "%s.%s.%s",.   
287f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
28820 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  ame, zTabName, z
28830 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
28840 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
28850 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
28860 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
28870 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
28880 20 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62    pX->bSpanIsTab
28890 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
288a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
288b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
288c0 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20  , zToFree);.    
288d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
288e0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  }.        if( !t
288f0 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20  ableSeen ){.    
28900 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
28910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28920 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28930 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
28940 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e   table: %s", zTN
28950 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
28960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28970 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28980 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74  sg(pParse, "no t
28990 61 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22  ables specified"
289a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
289b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
289c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
289d0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
289e0 28 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  (db, pEList);.  
289f0 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e    p->pEList = pN
28a00 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  ew;.  }.#if SQLI
28a10 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
28a20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  if( p->pEList &&
28a30 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
28a40 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
28a50 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
28a60 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
28a70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
28a80 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
28a90 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  ns in result set
28aa0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  ");.    return W
28ab0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65  RC_Abort;.  }.#e
28ac0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52  ndif.  return WR
28ad0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
28ae0 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
28af0 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
28b00 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
28b10 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
28b20 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
28b30 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
28b40 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
28b50 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
28b60 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
28b70 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
28b80 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
28b90 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
28ba0 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
28bb0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
28bc0 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
28bd0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
28be0 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
28bf0 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
28c00 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
28c10 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
28c20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
28c30 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
28c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
28c50 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
28c60 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
28c70 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
28c80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
28c90 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
28ca0 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
28cb0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
28cc0 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
28cd0 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
28ce0 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72  -tree walker for
28cf0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28d00 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ts..** subquery 
28d10 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
28d20 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ee..*/.int sqlit
28d30 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
28d40 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
28d50 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
28d60 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
28d70 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
28d80 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
28d90 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
28da0 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ue;.}..#if SQLIT
28db0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c  E_DEBUG./*.** Al
28dc0 77 61 79 73 20 61 73 73 65 72 74 2e 20 20 54 68  ways assert.  Th
28dd0 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  is xSelectCallba
28de0 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ck2 implementati
28df0 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74 20 74  on proves that t
28e00 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c  he.** xSelectCal
28e10 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20  lback2 is never 
28e20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  invoked..*/.void
28e30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
28e40 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72  lkAssert2(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 61 73 73 65 72 74 28 20  ed2);.  assert( 
28ea0 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a  0 );.}.#endif./*
28eb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
28ec0 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
28ed0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
28ee0 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
28ef0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
28f00 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
28f10 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
28f20 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
28f30 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
28f40 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
28f50 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
28f60 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
28f70 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
28f80 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
28f90 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
28fa0 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
28fb0 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
28fc0 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
28fd0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
28fe0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
28ff0 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
29000 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
29010 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
29020 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
29030 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
29040 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
29050 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
29060 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
29070 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
29080 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
29090 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
290a0 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
290b0 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
290c0 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
290d0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
290e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
290f0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
29100 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
29110 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
29120 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
29130 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
29140 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
29150 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
29160 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
29170 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
29180 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20  hasCompound ){. 
29190 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
291a0 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f  back = convertCo
291b0 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
291c0 62 71 75 65 72 79 3b 0a 20 20 20 20 77 2e 78 53  bquery;.    w.xS
291d0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
291e0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57   0;.    sqlite3W
291f0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
29200 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
29210 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
29220 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
29230 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
29240 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50  lback2 = selectP
29250 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65  opWith;.  sqlite
29260 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
29270 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
29280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29290 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
292a0 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
292b0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
292c0 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
292d0 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
292e0 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
292f0 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
29300 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
29310 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
29320 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
29330 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
29340 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
29350 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
29360 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
29370 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
29380 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
29390 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
293a0 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
293b0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
293c0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
293d0 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
293e0 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
293f0 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
29400 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
29410 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
29420 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
29430 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
29440 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
29450 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
29460 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
29470 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
29480 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
29490 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
294a0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
294b0 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
294c0 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
294d0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
294e0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
294f0 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
29500 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
29510 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
29520 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
29530 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
29540 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
29550 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
29560 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
29570 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
29580 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20  ypeInfo)==0 );. 
29590 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
295a0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
295b0 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
295c0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54  er->pParse;.  pT
295d0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
295e0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  ;.  for(i=0, pFr
295f0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
29600 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
29610 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
29620 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
29630 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
29640 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
29650 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
29660 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
29670 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
29680 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
29690 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
296a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
296b0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
296c0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
296d0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
296e0 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20  .      if( pSel 
296f0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
29700 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
29710 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
29720 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 71  rior;.        sq
29730 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
29740 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
29750 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
29760 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  b, pSel);.      
29770 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
29780 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
29790 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64  s routine adds d
297a0 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  atatype and coll
297b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
297c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a  nformation to.**
297d0 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
297e0 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f  tures of all FRO
297f0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
29800 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45  ies in a.** SELE
29810 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
29820 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75  .** Use this rou
29830 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20  tine after name 
29840 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
29850 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
29860 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
29870 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
29880 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
29890 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct){.#ifndef SQL
298a0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
298b0 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  Y.  Walker w;.  
298c0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
298d0 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  k = sqlite3Selec
298e0 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78  tWalkNoop;.  w.x
298f0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
29900 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
29910 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
29920 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
29930 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
29940 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
29950 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c   = pParse;.  sql
29960 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
29970 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e  w, pSelect);.#en
29980 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  dif.}.../*.** Th
29990 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
299a0 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  up a SELECT stat
299b0 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73  ement for proces
299c0 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f  sing.  The.** fo
299d0 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d  llowing is accom
299e0 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  plished:.**.**  
299f0 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f     *  VDBE Curso
29a00 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73  r numbers are as
29a10 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52  signed to all FR
29a20 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  OM-clause terms.
29a30 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d  .**     *  Ephem
29a40 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63  eral Table objec
29a50 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66  ts are created f
29a60 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  or all FROM-clau
29a70 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  se subqueries..*
29a80 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20  *     *  ON and 
29a90 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72  USING clauses ar
29aa0 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57  e shifted into W
29ab0 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a  HERE statements.
29ac0 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61  **     *  Wildca
29ad0 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42  rds "*" and "TAB
29ae0 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20  LE.*" in result 
29af0 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65  sets are expande
29b00 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65  d..**     *  Ide
29b10 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72  ntifiers in expr
29b20 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68  ession are match
29b30 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a  ed to tables..**
29b40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29b50 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c   acts recursivel
29b60 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  y on all subquer
29b70 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53  ies within the S
29b80 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
29b90 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
29ba0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
29bb0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
29bc0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
29bd0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29bf0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
29c00 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
29c10 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
29c20 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
29c30 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
29c40 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29  r container */.)
29c50 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
29c60 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
29c70 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
29c80 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
29c90 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
29ca0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
29cb0 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
29cc0 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
29cd0 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  nfo ) return;.  
29ce0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
29cf0 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  and(pParse, p);.
29d00 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
29d10 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
29d20 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
29d30 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
29d40 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
29d50 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
29d60 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
29d70 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
29d80 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29d90 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
29da0 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70  ectAddTypeInfo(p
29db0 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  Parse, p);.}../*
29dc0 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67  .** Reset the ag
29dd0 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
29de0 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  tor..**.** The a
29df0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
29e00 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66  ator is a set of
29e10 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68   memory cells th
29e20 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72  at hold.** inter
29e30 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20  mediate results 
29e40 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e  while calculatin
29e50 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  g an aggregate. 
29e60 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
29e70 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
29e80 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c  that stores NULL
29e90 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73  s in all of thos
29ea0 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c  e memory.** cell
29eb0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
29ec0 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74  d resetAccumulat
29ed0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
29ee0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
29ef0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
29f00 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
29f10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
29f20 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
29f30 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52  *pFunc;.  int nR
29f40 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  eg = pAggInfo->n
29f50 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d  Func + pAggInfo-
29f60 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20  >nColumn;.  if( 
29f70 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  nReg==0 ) return
29f80 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
29f90 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66  DEBUG.  /* Verif
29fa0 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e  y that all AggIn
29fb0 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65  fo registers are
29fc0 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67   within the rang
29fd0 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20  e specified by. 
29fe0 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65   ** AggInfo.mnRe
29ff0 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67  g..AggInfo.mxReg
2a000 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52   */.  assert( nR
2a010 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg==pAggInfo->mx
2a020 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  Reg-pAggInfo->mn
2a030 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69  Reg+1 );.  for(i
2a040 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2a050 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
2a060 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
2a070 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
2a080 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
2a090 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
2a0a0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
2a0b0 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2a0c0 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20  >mxReg );.  }.  
2a0d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
2a0e0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29  nfo->nFunc; i++)
2a0f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
2a100 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2a110 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
2a120 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
2a130 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  && pAggInfo->aFu
2a140 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  nc[i].iMem<=pAgg
2a150 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
2a160 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
2a170 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2a180 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67   OP_Null, 0, pAg
2a190 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41  gInfo->mnReg, pA
2a1a0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a  ggInfo->mxReg);.
2a1b0 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
2a1c0 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
2a1d0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2a1e0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
2a1f0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e  +){.    if( pFun
2a200 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  c->iDistinct>=0 
2a210 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
2a220 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72  E = pFunc->pExpr
2a230 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2a240 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2a250 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  (pE, EP_xIsSelec
2a260 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t) );.      if( 
2a270 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c  pE->x.pList==0 |
2a280 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  | pE->x.pList->n
2a290 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20  Expr!=1 ){.     
2a2a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2a2b0 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  sg(pParse, "DIST
2a2c0 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20  INCT aggregates 
2a2d0 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c  must have exactl
2a2e0 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20  y one ".        
2a2f0 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a     "argument");.
2a300 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
2a310 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
2a320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a330 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2a340 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
2a350 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2a360 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c  se, pE->x.pList,
2a370 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
2a380 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a390 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2a3a0 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
2a3b0 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2a3e0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2a3f0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
2a400 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2a410 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
2a420 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
2a430 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
2a440 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
2a450 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
2a460 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
2a470 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
2a480 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
2a490 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2a4a0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
2a4b0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
2a4c0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
2a4d0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2a4e0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2a4f0 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
2a500 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
2a510 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
2a520 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
2a530 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2a540 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
2a550 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
2a560 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2a570 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
2a580 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2a590 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
2a5a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2a5b0 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
2a5c0 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
2a5d0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  t->nExpr : 0);. 
2a5e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
2a5f0 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46  pendP4(v, pF->pF
2a600 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
2a610 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
2a620 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
2a630 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
2a640 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
2a650 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
2a660 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
2a670 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
2a680 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
2a690 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
2a6a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2a6b0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2a6c0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2a6d0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2a6e0 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69  t i;.  int regHi
2a6f0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64  t = 0;.  int add
2a700 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20  rHitTest = 0;.  
2a710 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2a720 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
2a730 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
2a740 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
2a750 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
2a760 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
2a770 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
2a780 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
2a790 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
2a7a0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
2a7b0 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
2a7c0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
2a7d0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
2a7e0 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
2a7f0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
2a800 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2a810 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
2a820 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
2a830 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
2a840 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
2a850 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
2a860 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
2a870 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
2a880 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67  nge(pParse, nArg
2a890 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a8a0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2a8b0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
2a8c0 72 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54  regAgg, 0, SQLIT
2a8d0 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20  E_ECEL_DUP);.   
2a8e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41   }else{.      nA
2a8f0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  rg = 0;.      re
2a900 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  gAgg = 0;.    }.
2a910 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73      if( pF->iDis
2a920 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20  tinct>=0 ){.    
2a930 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c    addrNext = sql
2a940 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2a950 6c 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74  l(v);.      test
2a960 63 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b  case( nArg==0 );
2a970 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69    /* Error condi
2a980 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65  tion */.      te
2a990 73 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29  stcase( nArg>1 )
2a9a0 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65  ;   /* Also an e
2a9b0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f  rror */.      co
2a9c0 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
2a9d0 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  e, pF->iDistinct
2a9e0 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72  , addrNext, 1, r
2a9f0 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20  egAgg);.    }.  
2aa00 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d    if( pF->pFunc-
2aa10 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
2aa20 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c  ITE_FUNC_NEEDCOL
2aa30 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  L ){.      CollS
2aa40 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
2aa50 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
2aa60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2aa70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
2aa80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
2aa90 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69  st!=0 );  /* pLi
2aaa0 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75  st!=0 if pF->pFu
2aab0 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20  nc has NEEDCOLL 
2aac0 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  */.      for(j=0
2aad0 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
2aae0 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41  ; !pColl && j<nA
2aaf0 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rg; j++, pItem++
2ab00 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
2ab10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
2ab20 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
2ab30 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
2ab40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2ab50 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
2ab60 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d   pColl = pParse-
2ab70 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a  >db->pDfltColl;.
2ab80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2ab90 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70  ( regHit==0 && p
2aba0 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
2abb0 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d  lator ) regHit =
2abc0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2abd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2abe0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
2abf0 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20  ollSeq, regHit, 
2ac00 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43  0, 0, (char *)pC
2ac10 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
2ac20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2ac30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2ac40 20 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c   OP_AggStep0, 0,
2ac50 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
2ac60 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  m);.    sqlite3V
2ac70 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
2ac80 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
2ac90 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74  CDEF);.    sqlit
2aca0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2acb0 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20  , (u8)nArg);.   
2acc0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2acd0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
2ace0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2acf0 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2ad00 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
2ad10 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
2ad20 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  g, nArg);.    if
2ad30 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20  ( addrNext ){.  
2ad40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2ad50 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2ad60 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ddrNext);.      
2ad70 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2ad80 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2ad90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42     }.  }..  /* B
2ada0 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67  efore populating
2adb0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2adc0 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61   registers, clea
2add0 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  r the column cac
2ade0 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  he..  ** Otherwi
2adf0 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68  se, if any of th
2ae00 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  e required colum
2ae10 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72  n values are alr
2ae20 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20  eady present .  
2ae30 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c  ** in registers,
2ae40 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2ae50 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43  () may use OP_SC
2ae60 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20  opy to copy the 
2ae70 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43  value.  ** to pC
2ae80 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74  ->iMem. But by t
2ae90 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75  he time the valu
2aea0 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f  e is used, the o
2aeb0 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72  riginal register
2aec0 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62  .  ** may have b
2aed0 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69  een used, invali
2aee0 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72  dating the under
2aef0 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c  lying buffer hol
2af00 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65  ding the.  ** te
2af10 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65  xt or blob value
2af20 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38  . See ticket [88
2af30 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a  3034dcb5]..  **.
2af40 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c    ** Another sol
2af50 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ution would be t
2af60 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  o change the OP_
2af70 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f  SCopy used to co
2af80 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76  py cached.  ** v
2af90 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43  alues to an OP_C
2afa0 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  opy..  */.  if( 
2afb0 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64  regHit ){.    ad
2afc0 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69  drHitTest = sqli
2afd0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2afe0 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b   OP_If, regHit);
2aff0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2b000 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2b010 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2b020 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
2b030 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
2b040 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
2b050 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
2b060 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
2b070 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
2b080 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
2b090 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
2b0a0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
2b0b0 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
2b0c0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2b0d0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2b0e0 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
2b0f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2b100 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2b110 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
2b120 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
2b130 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
2b140 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
2b150 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
2b160 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
2b170 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
2b180 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
2b190 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
2b1a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b1b0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
2b1c0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
2b1d0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
2b1e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b200 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
2b210 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
2b220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b230 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
2b240 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
2b250 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
2b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b270 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
2b280 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
2b290 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
2b2a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
2b2b0 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69  lain==2 ){.    i
2b2c0 6e 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64  nt bCover = (pId
2b2d0 78 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69  x!=0 && (HasRowi
2b2e0 64 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72  d(pTab) || !IsPr
2b2f0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
2b300 64 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20  dx)));.    char 
2b310 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d  *zEqp = sqlite3M
2b320 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
2b330 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  b, "SCAN TABLE %
2b340 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
2b350 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
2b360 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20       bCover ? " 
2b370 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
2b380 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
2b390 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49       bCover ? pI
2b3a0 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
2b3b0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
2b3c0 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20  3VdbeAddOp4(.   
2b3d0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64       pParse->pVd
2b3e0 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  be, OP_Explain, 
2b3f0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2b400 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50  d, 0, 0, zEqp, P
2b410 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b  4_DYNAMIC.    );
2b420 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
2b430 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d  efine explainSim
2b440 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a  pleCount(a,b,c).
2b450 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
2b460 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72  ntext object for
2b470 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78   havingToWhereEx
2b480 70 72 43 62 28 29 2e 0a 2a 2f 0a 73 74 72 75 63  prCb()..*/.struc
2b490 74 20 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43  t HavingToWhereC
2b4a0 74 78 20 7b 0a 20 20 45 78 70 72 20 2a 2a 70 70  tx {.  Expr **pp
2b4b0 57 68 65 72 65 3b 0a 20 20 45 78 70 72 4c 69 73  Where;.  ExprLis
2b4c0 74 20 2a 70 47 72 6f 75 70 42 79 3b 0a 7d 3b 0a  t *pGroupBy;.};.
2b4d0 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61  ./*.** sqlite3Wa
2b4e0 6c 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63  lkExpr() callbac
2b4f0 6b 20 75 73 65 64 20 62 79 20 68 61 76 69 6e 67  k used by having
2b500 54 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a  ToWhere()..**.**
2b510 20 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73   If the node pas
2b520 73 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  sed to the callb
2b530 61 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20  ack is a TK_AND 
2b540 6e 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  node, return .**
2b550 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f   WRC_Continue to
2b560 20 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c   tell sqlite3Wal
2b570 6b 45 78 70 72 28 29 20 74 6f 20 69 74 65 72 61  kExpr() to itera
2b580 74 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64  te through child
2b590 20 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   nodes..**.** Ot
2b5a0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2b5b0 57 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68  WRC_Prune. In th
2b5c0 69 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68  is case, also ch
2b5d0 65 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73  eck if the .** s
2b5e0 75 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  ub-expression ma
2b5f0 74 63 68 65 73 20 74 68 65 20 63 72 69 74 65 72  tches the criter
2b600 69 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76  ia for being mov
2b610 65 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  ed to the WHERE.
2b620 2a 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f  ** clause. If so
2b630 2c 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20  , add it to the 
2b640 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
2b650 20 72 65 70 6c 61 63 65 20 74 68 65 20 73 75 62   replace the sub
2b660 2d 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77  -expression.** w
2b670 69 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47  ithin the HAVING
2b680 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
2b690 20 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e   a constant "1".
2b6a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2b6b0 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72  avingToWhereExpr
2b6c0 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  Cb(Walker *pWalk
2b6d0 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
2b6e0 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  {.  if( pExpr->o
2b6f0 70 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p!=TK_AND ){.   
2b700 20 73 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f   struct HavingTo
2b710 57 68 65 72 65 43 74 78 20 2a 70 20 3d 20 70 57  WhereCtx *p = pW
2b720 61 6c 6b 65 72 2d 3e 75 2e 70 48 61 76 69 6e 67  alker->u.pHaving
2b730 43 74 78 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Ctx;.    if( sql
2b740 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
2b750 6e 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c  ntOrGroupBy(pWal
2b760 6b 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78  ker->pParse, pEx
2b770 70 72 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  pr, p->pGroupBy)
2b780 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b790 33 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d  3 *db = pWalker-
2b7a0 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
2b7b0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
2b7c0 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
2b7d0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
2b7e0 20 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65   &sqlite3IntToke
2b7f0 6e 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ns[1], 0);.     
2b800 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
2b810 20 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72       Expr *pWher
2b820 65 20 3d 20 2a 28 70 2d 3e 70 70 57 68 65 72 65  e = *(p->ppWhere
2b830 29 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28  );.        SWAP(
2b840 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45  Expr, *pNew, *pE
2b850 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  xpr);.        pN
2b860 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2b870 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20  And(db, pWhere, 
2b880 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 2a  pNew);.        *
2b890 28 70 2d 3e 70 70 57 68 65 72 65 29 20 3d 20 70  (p->ppWhere) = p
2b8a0 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  New;.      }.   
2b8b0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52   }.    return WR
2b8c0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72  C_Prune;.  }.  r
2b8d0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2b8e0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  ue;.}../*.** Tra
2b8f0 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74  nsfer eligible t
2b900 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41  erms from the HA
2b910 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  VING clause of a
2b920 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69 73   query, which is
2b930 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66  .** processed af
2b940 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f  ter grouping, to
2b950 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2b960 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f 63  e, which is proc
2b970 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  essed before.** 
2b980 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78  grouping. For ex
2b990 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
2b9a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
2b9b0 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
2b9c0 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50   WHERE a=? GROUP
2b9d0 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f   BY b HAVING b=?
2b9e0 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63   AND c=?.**.** c
2b9f0 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2ba00 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  as:.**.**   SELE
2ba10 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65  CT * FROM <table
2ba20 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  s> WHERE a=? AND
2ba30 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20   b=? GROUP BY b 
2ba40 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a  HAVING c=?.**.**
2ba50 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   A term of the H
2ba60 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2ba70 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72   is eligible for
2ba80 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74 20   transfer if it 
2ba90 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69  consists.** enti
2baa0 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74  rely of constant
2bab0 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e  s and expression
2bac0 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
2bad0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74  GROUP BY terms t
2bae0 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22  hat.** use the "
2baf0 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f  BINARY" collatio
2bb00 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  n sequence..*/.s
2bb10 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e  tatic void havin
2bb20 67 54 6f 57 68 65 72 65 28 0a 20 20 50 61 72 73  gToWhere(.  Pars
2bb30 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70  e *pParse,.  Exp
2bb40 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c  rList *pGroupBy,
2bb50 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
2bb60 2c 20 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68  , .  Expr **ppWh
2bb70 65 72 65 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  ere.){.  struct 
2bb80 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78  HavingToWhereCtx
2bb90 20 73 43 74 78 3b 0a 20 20 57 61 6c 6b 65 72 20   sCtx;.  Walker 
2bba0 73 57 61 6c 6b 65 72 3b 0a 0a 20 20 73 43 74 78  sWalker;..  sCtx
2bbb0 2e 70 70 57 68 65 72 65 20 3d 20 70 70 57 68 65  .ppWhere = ppWhe
2bbc0 72 65 3b 0a 20 20 73 43 74 78 2e 70 47 72 6f 75  re;.  sCtx.pGrou
2bbd0 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
2bbe0 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
2bbf0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  er, 0, sizeof(sW
2bc00 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b  alker));.  sWalk
2bc10 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
2bc20 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
2bc30 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61  xprCallback = ha
2bc40 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
2bc50 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70  b;.  sWalker.u.p
2bc60 48 61 76 69 6e 67 43 74 78 20 3d 20 26 73 43 74  HavingCtx = &sCt
2bc70 78 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  x;.  sqlite3Walk
2bc80 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70  Expr(&sWalker, p
2bc90 48 61 76 69 6e 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Having);.}../*.*
2bca0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
2bcb0 66 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72  f the pThis entr
2bcc0 79 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73  y of pTabList is
2bcd0 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20   a self-join of 
2bce0 61 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a  a prior view..**
2bcf0 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
2bd00 72 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69  return the SrcLi
2bd10 73 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20  st_item for the 
2bd20 70 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20  prior view.  If 
2bd30 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68  it is not,.** th
2bd40 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  en return 0..*/.
2bd50 73 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72  static struct Sr
2bd60 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65  cList_item *isSe
2bd70 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72  lfJoinView(.  Sr
2bd80 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
2bd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2bda0 61 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f  arch for self-jo
2bdb0 69 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d  ins in this FROM
2bdc0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
2bdd0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2bde0 20 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61   *pThis   /* Sea
2bdf0 72 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65  rch for prior re
2be00 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2be10 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
2be20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2be30 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
2be40 6f 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c  or(pItem = pTabL
2be50 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54  ist->a; pItem<pT
2be60 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  his; pItem++){. 
2be70 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
2be80 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69  elect==0 ) conti
2be90 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
2bea0 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2beb0 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ine ) continue;.
2bec0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2bed0 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Name==0 ) contin
2bee0 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2bef0 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
2bf00 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54  m->zDatabase, pT
2bf10 68 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21  his->zDatabase)!
2bf20 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2bf30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2bf40 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  tricmp(pItem->zN
2bf50 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d  ame, pThis->zNam
2bf60 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2bf70 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
2bf80 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
2bf90 0a 20 20 20 20 20 20 20 20 20 20 70 54 68 69 73  .          pThis
2bfa0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
2bfb0 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
2bfc0 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20 0a  t->pWhere, -1) .
2bfd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2bfe0 54 68 65 20 76 69 65 77 20 77 61 73 20 6d 6f 64  The view was mod
2bff0 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20 6f 74  ified by some ot
2c000 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
2c010 20 73 75 63 68 20 61 73 0a 20 20 20 20 20 20 2a   such as.      *
2c020 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  * pushDownWhereT
2c030 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20 20 20  erms() */.      
2c040 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
2c050 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 6d      return pItem
2c060 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
2c070 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2c080 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
2c090 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a  PTIMIZATION./*.*
2c0a0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 74 72 61  * Attempt to tra
2c0b0 6e 73 66 6f 72 6d 20 61 20 71 75 65 72 79 20 6f  nsform a query o
2c0c0 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
2c0d0 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
2c0e0 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  (*) FROM (SELECT
2c0f0 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   x FROM t1 UNION
2c100 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 20 46 52   ALL SELECT y FR
2c110 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74  OM t2).**.** Int
2c120 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
2c130 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
2c140 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
2c150 29 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  )+(SELECT count(
2c160 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a  *) FROM t2).**.*
2c170 2a 20 54 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  * The transforma
2c180 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  tion only works 
2c190 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
2c1a0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
2c1b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68 65  :.**.**   *  The
2c1c0 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 55   subquery is a U
2c1d0 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77 6f 20  NION ALL of two 
2c1e0 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a 2a 2a  or more terms.**
2c1f0 20 20 20 2a 20 20 54 68 65 72 65 20 69 73 20 6e     *  There is n
2c200 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f 55 50  o WHERE or GROUP
2c210 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20 63 6c   BY or HAVING cl
2c220 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73 75 62  auses on the sub
2c230 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a 20 20  queries.**   *  
2c240 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
2c250 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 75 6e  is a simple coun
2c260 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t(*).**.** Retur
2c270 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6f 70  n TRUE if the op
2c280 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 6e  timization is un
2c290 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  dertaken..*/.sta
2c2a0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f 66 56  tic int countOfV
2c2b0 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
2c2c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2c2d0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c  elect *p){.  Sel
2c2e0 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50 72 69  ect *pSub, *pPri
2c2f0 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  or;.  Expr *pExp
2c300 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f 75 6e  r;.  Expr *pCoun
2c310 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
2c320 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  ;.  if( (p->selF
2c330 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2c340 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ate)==0 ) return
2c350 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20 69 73   0;   /* This is
2c360 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
2c370 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ery */.  if( p->
2c380 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
2c390 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2c3b0 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
2c3c0 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20  mn */.  pExpr = 
2c3d0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
2c3e0 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78  pExpr;.  if( pEx
2c3f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
2c400 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
2c410 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65   0;        /* Re
2c420 73 75 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65  sult is an aggre
2c430 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71  gate */.  if( sq
2c440 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45  lite3_stricmp(pE
2c450 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63  xpr->u.zToken,"c
2c460 6f 75 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20  ount") ) return 
2c470 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63  0;  /* Must be c
2c480 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28 20  ount() */.  if( 
2c490 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d  pExpr->x.pList!=
2c4a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c4c0 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28 2a   Must be count(*
2c4d0 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53  ) */.  if( p->pS
2c4e0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65  rc->nSrc!=1 ) re
2c4f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
2c500 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2c510 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
2c520 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 70 53  M clause */.  pS
2c530 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
2c540 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66  0].pSelect;.  if
2c550 28 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74 75  ( pSub==0 ) retu
2c560 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c580 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20 61  /* The FROM is a
2c590 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
2c5a0 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  f( pSub->pPrior=
2c5b0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5d0 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63 6f   /* Must be a co
2c5e0 6d 70 6f 75 6e 64 20 73 75 62 71 75 65 72 79 20  mpound subquery 
2c5f0 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  */.  do{.    if(
2c600 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c   pSub->op!=TK_AL
2c610 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  L && pSub->pPrio
2c620 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  r ) return 0;  /
2c630 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e 20  * Must be UNION 
2c640 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ALL */.    if( p
2c650 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72 65  Sub->pWhere ) re
2c660 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
2c670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c680 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  No WHERE clause 
2c690 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
2c6a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2c6b0 67 67 72 65 67 61 74 65 20 29 20 72 65 74 75 72  ggregate ) retur
2c6c0 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  n 0;     /* Not 
2c6d0 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
2c6e0 20 20 20 20 70 53 75 62 20 3d 20 70 53 75 62 2d      pSub = pSub-
2c6f0 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20  >pPrior;        
2c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c710 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61 74 20        /* Repeat 
2c720 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 74 65  over compound te
2c730 72 6d 73 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28  rms */.  }while(
2c740 20 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20 49   pSub );..  /* I
2c750 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
2c760 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
2c770 73 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65  s it is OK to pe
2c780 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66  rform the transf
2c790 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64  ormation */..  d
2c7a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2c7b0 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72    pCount = pExpr
2c7c0 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20  ;.  pExpr = 0;. 
2c7d0 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pSub = p->pSrc-
2c7e0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
2c7f0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
2c800 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71  Select = 0;.  sq
2c810 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
2c820 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b  te(db, p->pSrc);
2c830 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c  .  p->pSrc = sql
2c840 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
2c850 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
2c860 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a  eof(*p->pSrc));.
2c870 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b    while( pSub ){
2c880 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d  .    Expr *pTerm
2c890 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
2c8a0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sub->pPrior;.   
2c8b0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20   pSub->pPrior = 
2c8c0 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65  0;.    pSub->pNe
2c8d0 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  xt = 0;.    pSub
2c8e0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2c8f0 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
2c900 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2c910 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
2c920 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63      pSub->nSelec
2c930 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71  tRow = 0;.    sq
2c940 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2c950 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  ete(db, pSub->pE
2c960 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d  List);.    pTerm
2c970 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69   = pPrior ? sqli
2c980 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
2c990 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75  Count, 0) : pCou
2c9a0 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45  nt;.    pSub->pE
2c9b0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
2c9c0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
2c9d0 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a  rse, 0, pTerm);.
2c9e0 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
2c9f0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2ca00 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30   TK_SELECT, 0, 0
2ca10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45  );.    sqlite3PE
2ca20 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61  xprAddSelect(pPa
2ca30 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62  rse, pTerm, pSub
2ca40 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
2ca50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ==0 ){.      pEx
2ca60 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  pr = pTerm;.    
2ca70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78  }else{.      pEx
2ca80 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
2ca90 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55  r(pParse, TK_PLU
2caa0 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29  S, pTerm, pExpr)
2cab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
2cac0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20   = pPrior;.  }. 
2cad0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
2cae0 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
2caf0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2cb00 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
2cb10 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2cb20 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2cb30 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2cb40 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
2cb50 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
2cb60 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
2cb70 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65  ter count-of-vie
2cb80 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c  w optimization:\
2cb90 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2cba0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2cbb0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2cbc0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b  ndif.  return 1;
2cbd0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2cbe0 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
2cbf0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
2cc00 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2cc10 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
2cc20 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
2cc30 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
2cc40 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
2cc50 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
2cc60 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
2cc70 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
2cc80 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
2cc90 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
2cca0 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
2ccb0 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
2ccc0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
2ccd0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2cce0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2ccf0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
2cd00 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
2cd10 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
2cd20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
2cd30 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2cd40 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
2cd50 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
2cd60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2cd70 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
2cd80 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
2cd90 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
2cda0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
2cdb0 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
2cdc0 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
2cdd0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
2cde0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2cdf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2ce00 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2ce10 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2ce20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ce30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2ce40 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
2ce50 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
2ce60 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
2ce70 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
2ce80 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
2ce90 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ceb0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2cec0 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
2ced0 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
2cee0 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
2cef0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
2cf00 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
2cf10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cf20 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
2cf30 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
2cf40 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
2cf50 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
2cf60 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
2cf70 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
2cf80 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
2cf90 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
2cfa0 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
2cfb0 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
2cfc0 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
2cfd0 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
2cfe0 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
2cff0 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
2d000 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2d010 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
2d020 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2d030 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2d040 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
2d050 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
2d060 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
2d070 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2d080 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
2d090 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
2d0a0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2d0b0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2d0c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
2d0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2d0e0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
2d0f0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
2d100 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
2d110 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
2d120 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2d130 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
2d140 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
2d150 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
2d160 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
2d170 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2d180 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2d190 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
2d1a0 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
2d1b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
2d1c0 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
2d1d0 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
2d1e0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
2d1f0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
2d200 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
2d210 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
2d220 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2d230 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2d240 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
2d250 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d260 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
2d270 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2d280 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
2d290 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
2d2a0 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
2d2b0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2d2c0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
2d2d0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2d2e0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
2d2f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2d300 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
2d310 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
2d320 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2d330 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2d340 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
2d350 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
2d360 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
2d370 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
2d380 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
2d390 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2d3a0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72  E_ENABLED.  pPar
2d3b0 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
2d3c0 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  t++;.  SELECTTRA
2d3d0 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
2d3e0 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
2d3f0 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73  g:\n"));.  if( s
2d400 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2d410 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2d420 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2d430 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2d440 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
2d450 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2d460 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2d470 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
2d480 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2d490 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2d4a0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2d4b0 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
2d4c0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2d4d0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2d4e0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
2d4f0 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
2d500 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2d510 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d520 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
2d530 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
2d540 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2d550 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
2d560 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
2d570 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
2d580 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
2d590 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
2d5a0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d5b0 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
2d5c0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
2d5d0 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
2d5e0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2d5f0 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
2d600 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d610 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
2d620 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2d630 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
2d640 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
2d650 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
2d660 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
2d670 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
2d680 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
2d690 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
2d6a0 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
2d6b0 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
2d6c0 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
2d6d0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
2d6e0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2d6f0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
2d700 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
2d710 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
2d720 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
2d730 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
2d740 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
2d750 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
2d760 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
2d770 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
2d780 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2d790 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2d7a0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2d7b0 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72  pSrc;.  if( pPar
2d7c0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
2d7d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2d7e0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2d7f0 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  end;.  }.  asser
2d800 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
2d810 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  );.  isAgg = (p-
2d820 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2d830 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69  ggregate)!=0;.#i
2d840 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2d850 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2d860 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2d870 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
2d880 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2d890 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
2d8a0 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2d8b0 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
2d8c0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2d8d0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2d8e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
2d8f0 74 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20  t a pointer the 
2d900 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
2d910 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ruction, allocat
2d920 69 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69  ing a new VDBE i
2d930 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20  f one.  ** does 
2d940 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
2d950 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74  t */.  v = sqlit
2d960 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
2d970 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
2d980 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2d990 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
2d9a0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
2d9b0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
2d9c0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
2d9d0 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
2d9e0 20 54 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20   Try to flatten 
2d9f0 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74 68  subqueries in th
2da00 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70  e FROM clause up
2da10 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71   into the main q
2da20 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64  uery.  */.#if !d
2da30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2da40 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
2da50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2da60 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
2da70 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
2da80 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
2da90 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2daa0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2dab0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
2dac0 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
2dad0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
2dae0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
2daf0 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75  .    int isAggSu
2db00 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  b;.    Table *pT
2db10 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
2db20 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ;.    if( pSub==
2db30 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
2db40 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d     /* Catch mism
2db50 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c  atch in the decl
2db60 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ared columns of 
2db70 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e  a view and the n
2db80 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
2db90 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53  columns in the S
2dba0 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53  ELECT on the RHS
2dbb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62   */.    if( pTab
2dbc0 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45  ->nCol!=pSub->pE
2dbd0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
2dbe0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2dbf0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78  rMsg(pParse, "ex
2dc00 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
2dc10 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67  s for '%s' but g
2dc20 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  ot %d",.        
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
2dc40 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
2dc50 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c  zName, pSub->pEL
2dc60 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
2dc70 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2dc80 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  nd;.    }..    i
2dc90 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d  sAggSub = (pSub-
2dca0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2dcb0 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20  ggregate)!=0;.  
2dcc0 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
2dcd0 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
2dce0 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67   i, isAgg, isAgg
2dcf0 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Sub) ){.      /*
2dd00 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63   This subquery c
2dd10 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69  an be absorbed i
2dd20 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20  nto its parent. 
2dd30 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41  */.      if( isA
2dd40 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  ggSub ){.       
2dd50 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20   isAgg = 1;.    
2dd60 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
2dd70 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b  |= SF_Aggregate;
2dd80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2dd90 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2dda0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2ddb0 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Src;.    if( db-
2ddc0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2ddd0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2dde0 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
2ddf0 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
2de00 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  ) ){.      sSort
2de10 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
2de20 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
2de30 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   }.#endif..#ifnd
2de40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
2de50 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
2de60 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f   /* Handle compo
2de70 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
2de80 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20  ments using the 
2de90 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65  separate multiSe
2dea0 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63  lect().  ** proc
2deb0 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  edure..  */.  if
2dec0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
2ded0 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
2dee0 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
2def0 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61  Dest);.    expla
2df00 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
2df10 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2df20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
2df30 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2df40 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53  CE_ENABLED.    S
2df50 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2df60 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70  rse,p,("end comp
2df70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63  ound-select proc
2df80 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20  essing\n"));.   
2df90 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
2dfa0 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
2dfb0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2dfc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2dfd0 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   For each term i
2dfe0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2dff0 65 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67 73  e, do two things
2e000 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75 74 68 6f  :.  ** (1) Autho
2e010 72 69 7a 65 64 20 75 6e 72 65 66 65 72 65 6e 63  rized unreferenc
2e020 65 64 20 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28  ed tables.  ** (
2e030 32 29 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  2) Generate code
2e040 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
2e050 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ries.  */.  for(
2e060 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
2e070 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2e080 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2e090 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2e0a0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
2e0b0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
2e0c0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
2e0d0 70 53 75 62 3b 0a 0a 20 20 20 20 2f 2a 20 49 73  pSub;..    /* Is
2e0e0 73 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20  sue SQLITE_READ 
2e0f0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77  authorizations w
2e100 69 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d  ith a fake colum
2e110 6e 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 20 74  n name for any t
2e120 61 62 6c 65 73 20 74 68 61 74 0a 20 20 20 20 2a  ables that.    *
2e130 2a 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64  * are referenced
2e140 20 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20   but from which 
2e150 6e 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65 78  no values are ex
2e160 74 72 61 63 74 65 64 2e 20 45 78 61 6d 70 6c 65  tracted. Example
2e170 73 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65  s of where these
2e180 0a 20 20 20 20 2a 2a 20 6b 69 6e 64 73 20 6f 66  .    ** kinds of
2e190 20 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41   null SQLITE_REA
2e1a0 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73  D authorizations
2e1b0 20 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20   would occur:.  
2e1c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
2e1d0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2e1e0 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51  FROM t1;   -- SQ
2e1f0 4c 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a  LITE_READ t1."".
2e200 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
2e210 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20  T t1.* FROM t1, 
2e220 74 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f  t2;   -- SQLITE_
2e230 52 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a  READ t2."".    *
2e240 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b  *.    ** The fak
2e250 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
2e260 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
2e270 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
2e280 65 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f  e for a table to
2e290 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63  .    ** have a c
2e2a0 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74  olumn named by t
2e2b0 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c  he empty string,
2e2c0 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
2e2d0 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
2e2e0 6f 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67  o.    ** disting
2e2f0 75 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20  uish between an 
2e300 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  unreferenced tab
2e310 6c 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c  le and an actual
2e320 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2e330 65 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75  e.    ** "" colu
2e340 6d 6e 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61  mn.  The origina
2e350 6c 20 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72  l design was for
2e360 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   the fake column
2e370 20 6e 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55   name to be a NU
2e380 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  LL,.    ** which
2e390 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69   would be unambi
2e3a0 67 75 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61  guous.  But lega
2e3b0 63 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  cy authorization
2e3c0 20 63 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74   callbacks might
2e3d0 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  .    ** assume t
2e3e0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
2e3f0 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73  s non-NULL and s
2e400 65 67 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73  egfault.  The us
2e410 65 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 73 74  e of an empty st
2e420 72 69 6e 67 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ring.    ** for 
2e430 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  the fake column 
2e440 6e 61 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72  name seems safer
2e450 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e460 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d   pItem->colUsed=
2e470 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2e480 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2e490 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44  rse, SQLITE_READ
2e4a0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  , pItem->zName, 
2e4b0 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  "", pItem->zData
2e4c0 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  base);.    }..#i
2e4d0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2e4e0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2e4f0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2e500 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
2e510 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
2e520 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
2e530 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
2e540 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a  ROM clause.    *
2e550 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 49 74  /.    pSub = pIt
2e560 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
2e570 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
2e580 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2e590 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63   Sometimes the c
2e5a0 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75 65  ode for a subque
2e5b0 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  ry will be gener
2e5c0 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ated more than. 
2e5d0 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74     ** once, if t
2e5e0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70  he subquery is p
2e5f0 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52 45  art of the WHERE
2e600 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46   clause in a LEF
2e610 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66  T JOIN,.    ** f
2e620 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20  or example.  In 
2e630 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f  that case, do no
2e640 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68 65  t regenerate the
2e650 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73   code to manifes
2e660 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20  t.    ** a view 
2e670 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  or the co-routin
2e680 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  e to implement a
2e690 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72 73   view.  The firs
2e6a0 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a  t instance.    *
2e6b0 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c  * is sufficient,
2e6c0 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 72   though the subr
2e6d0 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65  outine to manife
2e6e0 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65 73  st the view does
2e6f0 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
2e700 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e  be invoked again
2e710 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74  . */.    if( pIt
2e720 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
2e730 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
2e740 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
2e750 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
2e760 20 20 2f 2a 20 54 68 65 20 73 75 62 72 6f 75 74    /* The subrout
2e770 69 6e 65 20 74 68 61 74 20 6d 61 6e 69 66 65 73  ine that manifes
2e780 74 73 20 74 68 65 20 76 69 65 77 20 6d 69 67 68  ts the view migh
2e790 74 20 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20  t be a one-time 
2e7a0 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 20  routine,.       
2e7b0 20 2a 2a 20 6f 72 20 69 74 20 6d 69 67 68 74 20   ** or it might 
2e7c0 6e 65 65 64 20 74 6f 20 62 65 20 72 65 72 75 6e  need to be rerun
2e7d0 20 6f 6e 20 65 61 63 68 20 69 74 65 72 61 74 69   on each iterati
2e7e0 6f 6e 20 62 65 63 61 75 73 65 20 69 74 0a 20 20  on because it.  
2e7f0 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73        ** encodes
2e800 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75   a correlated su
2e810 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20  bquery. */.     
2e820 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c     testcase( sql
2e830 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
2e840 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2e850 53 75 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50  Sub)->opcode==OP
2e860 5f 4f 6e 63 65 20 29 3b 0a 20 20 20 20 20 20 20  _Once );.       
2e870 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e880 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2e890 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2e8a0 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
2e8b0 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lSub);.      }. 
2e8c0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2e8d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63     }..    /* Inc
2e8e0 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65  rement Parse.nHe
2e8f0 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67  ight by the heig
2e900 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73  ht of the larges
2e910 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  t expression.   
2e920 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65   ** tree referre
2e930 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68  d to by this, th
2e940 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e  e parent select.
2e950 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63   The child selec
2e960 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e  t.    ** may con
2e970 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  tain expression 
2e980 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74  trees of at most
2e990 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f  .    ** (SQLITE_
2e9a0 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50  MAX_EXPR_DEPTH-P
2e9b0 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65  arse.nHeight) he
2e9c0 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20  ight. This is a 
2e9d0 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20  bit.    ** more 
2e9e0 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61  conservative tha
2e9f0 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74  n necessary, but
2ea00 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61   much easier tha
2ea10 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20  n enforcing.    
2ea20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69  ** an exact limi
2ea30 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
2ea40 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
2ea50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
2ea60 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20  prHeight(p);..  
2ea70 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73    /* Make copies
2ea80 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45   of constant WHE
2ea90 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20  RE-clause terms 
2eaa0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
2eab0 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69  ry down.    ** i
2eac0 6e 73 69 64 65 20 74 68 65 20 73 75 62 71 75 65  nside the subque
2ead0 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65  ry.  This can he
2eae0 6c 70 20 74 68 65 20 73 75 62 71 75 65 72 79 20  lp the subquery 
2eaf0 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69  to run more effi
2eb00 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  ciently..    */.
2eb10 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d 3e      if( (pItem->
2eb20 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2eb30 5f 4f 55 54 45 52 29 3d 3d 30 0a 20 20 20 20 20  _OUTER)==0.     
2eb40 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  && pushDownWhere
2eb50 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53  Terms(pParse, pS
2eb60 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  ub, p->pWhere, p
2eb70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20  Item->iCursor). 
2eb80 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54     ){.#if SELECT
2eb90 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2eba0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2ebb0 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
2ebc0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45  00 ){.        SE
2ebd0 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2ebe0 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
2ebf0 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75   WHERE-clause pu
2ec00 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20  sh-down:\n"));. 
2ec10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
2ec20 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2ec30 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23  p, 0);.      }.#
2ec40 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
2ec50 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2ec60 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
2ec70 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2ec80 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 75  **.    ** The su
2ec90 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c 65 6d  bquery is implem
2eca0 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f  ented as a co-ro
2ecb0 75 74 69 6e 65 20 69 66 20 61 6c 6c 20 6f 66 20  utine if all of 
2ecc0 74 68 65 73 65 20 61 72 65 20 74 72 75 65 3a 0a  these are true:.
2ecd0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 54 68      **   (1)  Th
2ece0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 67 75  e subquery is gu
2ecf0 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74  aranteed to be t
2ed00 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73  he outer loop (s
2ed10 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a  o that it.    **
2ed20 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f 74          does not
2ed30 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f 6d 70   need to be comp
2ed40 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  uted more than o
2ed50 6e 63 65 29 0a 20 20 20 20 2a 2a 20 20 20 28 32  nce).    **   (2
2ed60 29 20 20 54 68 65 20 41 4c 4c 20 6b 65 79 77 6f  )  The ALL keywo
2ed70 72 64 20 61 66 74 65 72 20 53 45 4c 45 43 54 20  rd after SELECT 
2ed80 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 28 41 70  is omitted.  (Ap
2ed90 70 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 0a 20  plications are. 
2eda0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6c 6c     **        all
2edb0 6f 77 65 64 20 74 6f 20 73 61 79 20 22 53 45 4c  owed to say "SEL
2edc0 45 43 54 20 41 4c 4c 22 20 69 6e 73 74 65 61 64  ECT ALL" instead
2edd0 20 6f 66 20 6a 75 73 74 20 22 53 45 4c 45 43 54   of just "SELECT
2ede0 22 20 74 6f 20 64 69 73 61 62 6c 65 0a 20 20 20  " to disable.   
2edf0 20 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 75   **        the u
2ee00 73 65 20 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65  se of co-routine
2ee10 73 2e 29 0a 20 20 20 20 2a 2a 20 20 20 28 33 29  s.).    **   (3)
2ee20 20 20 43 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72    Co-routines ar
2ee30 65 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 20 75  e not disabled u
2ee40 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 74 65 73  sing sqlite3_tes
2ee50 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 20 20 20 20  t_control().    
2ee60 2a 2a 20 20 20 20 20 20 20 20 77 69 74 68 20 53  **        with S
2ee70 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2ee80 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2e 0a 20 20  PTIMIZATIONS..  
2ee90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f    **.    ** TODO
2eea0 3a 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65  : Are there othe
2eeb0 72 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65  r reasons beside
2eec0 20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f   (1) to use a co
2eed0 2d 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20  -routine.    ** 
2eee0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a  implementation?.
2eef0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
2ef00 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61  ==0.     && (pTa
2ef10 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20  bList->nSrc==1. 
2ef20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
2ef30 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
2ef40 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
2ef50 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
2ef60 29 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20  )  /* (1) */.   
2ef70 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67    && (p->selFlag
2ef80 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d 30 20 20  s & SF_All)==0  
2ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efb0 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
2efc0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
2efd0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
2efe0 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
2eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f000 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 29 7b 0a  * (3) */.    ){.
2f010 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65        /* Impleme
2f020 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  nt a co-routine 
2f030 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e  that will return
2f040 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2f050 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2f060 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68    ** set on each
2f070 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20   invocation..   
2f080 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
2f090 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
2f0a0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2f0b0 28 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74  (v)+1;.      pIt
2f0c0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2f0d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2f0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f0f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
2f100 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  itCoroutine, pIt
2f110 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30  em->regReturn, 0
2f120 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
2f130 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2f140 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  , "%s", pItem->p
2f150 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2f160 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
2f170 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
2f180 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2f190 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2f1a0 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
2f1b0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2f1c0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70  turn);.      exp
2f1d0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2f1e0 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2f1f0 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2f200 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2f210 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2f220 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
2f230 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
2f240 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
2f250 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
2f260 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70  lectRow;.      p
2f270 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2f280 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  utine = 1;.     
2f290 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c   pItem->regResul
2f2a0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
2f2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f2c0 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
2f2d0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2f2e0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
2f2f0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2f300 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20   addrTop-1);.   
2f310 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
2f320 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
2f330 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
2f340 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2f350 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
2f360 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e  hat will fill an
2f370 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2f380 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74   with.      ** t
2f390 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2f3a0 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49  is subquery.  pI
2f3b0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2f3c0 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20   will point.    
2f3d0 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
2f3e0 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
2f3f0 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
2f400 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2f410 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  rn.      ** is a
2f420 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
2f430 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2f440 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
2f450 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20  n address.      
2f460 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  */.      int top
2f470 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Addr;.      int 
2f480 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  onceAddr = 0;.  
2f490 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b      int retAddr;
2f4a0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
2f4b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72 69  cList_item *pPri
2f4c0 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  or;..      asser
2f4d0 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  t( pItem->addrFi
2f4e0 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20  llSub==0 );.    
2f4f0 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2f500 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
2f510 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64  Mem;.      topAd
2f520 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2f530 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2f540 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e  eger, 0, pItem->
2f550 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2f560 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
2f570 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31  lSub = topAddr+1
2f580 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
2f590 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  m->fg.isCorrelat
2f5a0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
2f5b0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
2f5c0 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
2f5d0 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
2f5e0 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
2f5f0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
2f600 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
2f610 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
2f620 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
2f630 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
2f640 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
2f650 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
2f660 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2f670 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
2f680 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
2f690 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
2f6a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  beComment((v, "m
2f6b0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2f6c0 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2f6d0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2f6e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56  }else{.        V
2f6f0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
2f700 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2f710 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2f720 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2f730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 72       }.      pPr
2f740 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e  ior = isSelfJoin
2f750 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20 70  View(pTabList, p
2f760 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Item);.      if(
2f770 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20   pPrior ){.     
2f780 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f790 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
2f7a0 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  up, pItem->iCurs
2f7b0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75 72  or, pPrior->iCur
2f7c0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  sor);.        ex
2f7d0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2f7e0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2f7f0 2c 20 70 50 72 69 6f 72 2d 3e 69 53 65 6c 65 63  , pPrior->iSelec
2f800 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 61 73  tId);.        as
2f810 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 53  sert( pPrior->pS
2f820 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
2f830 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63      pSub->nSelec
2f840 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70  tRow = pPrior->p
2f850 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52  Select->nSelectR
2f860 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ow;.      }else{
2f870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f880 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
2f890 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54  dest, SRT_EphemT
2f8a0 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ab, pItem->iCurs
2f8b0 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  or);.        exp
2f8c0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2f8d0 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2f8e0 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2f8f0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2f900 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2f910 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
2f920 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   &dest);.      }
2f930 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
2f940 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
2f950 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
2f960 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  w;.      if( onc
2f970 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
2f980 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
2f990 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
2f9a0 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
2f9b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2f9c0 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
2f9d0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2f9e0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2f9f0 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
2fa00 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2fa10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2fa20 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
2fa30 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
2fa40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2fa50 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2fa60 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
2fa70 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2fa80 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2fa90 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2faa0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
2fab0 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
2fac0 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
2fad0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
2fae0 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74   Various element
2faf0 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
2fb00 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61  copied into loca
2fb10 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a  l variables for.
2fb20 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65    ** convenience
2fb30 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   */.  pEList = p
2fb40 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65  ->pEList;.  pWhe
2fb50 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
2fb60 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2fb70 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
2fb80 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
2fb90 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
2fba0 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
2fbb0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
2fbc0 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45  t)!=0;..#if SELE
2fbd0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2fbe0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2fbf0 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30  ectTrace & 0x400
2fc00 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2fc10 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65  ACE(0x400,pParse
2fc20 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46  ,p,("After all F
2fc30 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79  ROM-clause analy
2fc40 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  sis:\n"));.    s
2fc50 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2fc60 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2fc70 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
2fc80 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46  f SQLITE_COUNTOF
2fc90 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  VIEW_OPTIMIZATIO
2fca0 4e 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  N.  if( Optimiza
2fcb0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
2fcc0 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
2fcd0 74 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75  tener|SQLITE_Cou
2fce0 6e 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20  ntOfView).   && 
2fcf0 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d  countOfViewOptim
2fd00 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  ization(pParse, 
2fd10 70 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  p).  ){.    if( 
2fd20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2fd30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2fd40 6e 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  nd;.    pEList =
2fd50 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
2fd60 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2fd70 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
2fd80 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
2fd90 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69  y is DISTINCT wi
2fda0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62  th an ORDER BY b
2fdb0 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ut is not an agg
2fdc0 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a  regate, and .  *
2fdd0 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d  * if the select-
2fde0 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65  list is the same
2fdf0 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59   as the ORDER BY
2fe00 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73   list, then this
2fe10 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20   query.  ** can 
2fe20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  be rewritten as 
2fe30 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f  a GROUP BY. In o
2fe40 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73  ther words, this
2fe50 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2fe60 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
2fe70 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44  xyz FROM ... ORD
2fe80 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
2fe90 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d   ** is transform
2fea0 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ed to:.  **.  **
2feb0 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20       SELECT xyz 
2fec0 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42  FROM ... GROUP B
2fed0 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78  Y xyz ORDER BY x
2fee0 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  yz.  **.  ** The
2fef0 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20   second form is 
2ff00 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73  preferred as a s
2ff10 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20  ingle index (or 
2ff20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20  temp-table) may 
2ff30 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f  be .  ** used fo
2ff40 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52  r both the ORDER
2ff50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
2ff60 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20   processing. As 
2ff70 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a  originally .  **
2ff80 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65   written the que
2ff90 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65  ry must use a te
2ffa0 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20  mp-table for at 
2ffb0 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
2ffc0 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20   ORDER .  ** BY 
2ffd0 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e  and DISTINCT, an
2ffe0 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65  d an index or se
2fff0 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c  parate temp-tabl
30000 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e  e for the other.
30010 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
30020 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
30030 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
30040 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69  gate))==SF_Disti
30050 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74  nct .   && sqlit
30060 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
30070 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  e(sSort.pOrderBy
30080 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30  , pEList, -1)==0
30090 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c  .  ){.    p->sel
300a0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
300b0 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75  tinct;.    pGrou
300c0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
300d0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
300e0 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
300f0 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  t, 0);.    /* No
30100 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
30110 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
30120 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
30130 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
30140 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
30150 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
30160 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
30170 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
30180 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
30190 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
301a0 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
301b0 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
301c0 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
301d0 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
301e0 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
301f0 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53  isTnct );..#if S
30200 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
30210 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
30220 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
30230 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53  0x400 ){.      S
30240 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30  ELECTTRACE(0x400
30250 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e  ,pParse,p,("Tran
30260 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69  sform DISTINCT i
30270 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22  nto GROUP BY:\n"
30280 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
30290 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
302a0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, p, 0);.    }.
302b0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
302c0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
302d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
302e0 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20   then create an 
302f0 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
30300 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73  to.  ** do the s
30310 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69  orting.  But thi
30320 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65  s sorting epheme
30330 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20  ral index might 
30340 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e  end up.  ** bein
30350 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20  g unused if the 
30360 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72  data can be extr
30370 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72  acted in pre-sor
30380 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20  ted order..  ** 
30390 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
303a0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50  ase, then the OP
303b0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
303c0 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
303d0 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20  be.  ** changed 
303e0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
303f0 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ce we figure out
30400 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
30410 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20  g index is.  ** 
30420 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
30430 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
30440 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73  ndex variable is
30450 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
30460 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68  ate.  ** that ch
30470 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ange..  */.  if(
30480 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
30490 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
304a0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b  pKeyInfo;.    pK
304b0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
304c0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
304d0 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  rse, sSort.pOrde
304e0 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e  rBy, 0, pEList->
304f0 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72  nExpr);.    sSor
30500 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  t.iECursor = pPa
30510 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
30520 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
30530 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c  ndex =.      sql
30540 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
30550 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
30560 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53  al,.          sS
30570 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53  ort.iECursor, sS
30580 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
30590 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45  xpr+1+pEList->nE
305a0 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  xpr, 0,.        
305b0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
305c0 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20  o, P4_KEYINFO.  
305d0 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
305e0 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
305f0 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  rtIndex = -1;.  
30600 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  }..  /* If the o
30610 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65  utput is destine
30620 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72  d for a temporar
30630 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68  y table, open th
30640 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  at table..  */. 
30650 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
30660 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
30670 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
30680 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
30690 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44  penEphemeral, pD
306a0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45  est->iSDParm, pE
306b0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
306c0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
306d0 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20  limiter..  */.  
306e0 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  iEnd = sqlite3Vd
306f0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
30700 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
30710 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
30720 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  it)==0 ){.    p-
30730 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32  >nSelectRow = 32
30740 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e  0;  /* 4 billion
30750 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63   rows */.  }.  c
30760 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
30770 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
30780 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
30790 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f  iLimit==0 && sSo
307a0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
307b0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
307c0 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f  e3VdbeChangeOpco
307d0 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  de(v, sSort.addr
307e0 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f  SortIndex, OP_So
307f0 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73  rterOpen);.    s
30800 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c  Sort.sortFlags |
30810 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f  = SORTFLAG_UseSo
30820 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rter;.  }..  /* 
30830 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  Open an ephemera
30840 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
30850 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
30860 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
30870 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
30880 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
30890 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
308a0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
308b0 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  b++;.    sDistin
308c0 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71  ct.addrTnct = sq
308d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
308e0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
308f0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ral,.           
30900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30910 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
30920 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
30930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30940 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b          (char*)k
30950 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
30960 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  st(pParse, p->pE
30970 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20  List,0,0),.     
30980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30990 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
309a0 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  FO);.    sqlite3
309b0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
309c0 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
309d0 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
309e0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
309f0 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
30a00 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERED;.  }else{. 
30a10 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
30a20 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
30a30 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
30a40 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20  }..  if( !isAgg 
30a50 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29  && pGroupBy==0 )
30a60 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72  {.    /* No aggr
30a70 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
30a80 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
30a90 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31  clause */.    u1
30aa0 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  6 wctrlFlags = (
30ab0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
30ac0 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   ? WHERE_WANT_DI
30ad0 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20  STINCT : 0);.   
30ae0 20 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55   assert( WHERE_U
30af0 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78  SE_LIMIT==SF_Fix
30b00 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 77  edLimit );.    w
30b10 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e  ctrlFlags |= p->
30b20 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
30b30 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f  xedLimit;..    /
30b40 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
30b50 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
30b60 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
30b70 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
30b80 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
30b90 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
30ba0 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
30bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bc0 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
30bd0 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e   wctrlFlags, p->
30be0 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
30bf0 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
30c00 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
30c10 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
30c20 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
30c30 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
30c40 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
30c50 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
30c60 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
30c70 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
30c80 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
30c90 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
30ca0 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
30cb0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
30cc0 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
30cd0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
30ce0 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
30cf0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
30d00 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
30d10 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f      if( sSort.pO
30d20 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
30d30 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73  sSort.nOBSat = s
30d40 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
30d50 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ered(pWInfo);.  
30d60 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72      sSort.bOrder
30d70 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71  edInnerLoop = sq
30d80 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 65  lite3WhereOrdere
30d90 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66  dInnerLoop(pWInf
30da0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53  o);.      if( sS
30db0 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72  ort.nOBSat==sSor
30dc0 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
30dd0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f  r ){.        sSo
30de0 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
30df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
30e00 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
30e10 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
30e20 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
30e30 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
30e40 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
30e50 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
30e60 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
30e70 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
30e80 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
30e90 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
30ea0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
30eb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72   */.    if( sSor
30ec0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
30ed0 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64  =0 && sSort.pOrd
30ee0 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
30ef0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
30f00 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
30f10 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
30f20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
30f30 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
30f40 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
30f50 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
30f60 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
30f70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72  EList, -1, &sSor
30f80 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  t, &sDistinct, p
30f90 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
30fa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30fb0 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
30fc0 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
30fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fe0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
30ff0 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
31000 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
31010 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
31020 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
31030 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
31040 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
31050 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
31060 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
31070 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
31080 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
31090 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
310a0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
310b0 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
310c0 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
310d0 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
310e0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
310f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
31100 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
31110 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
31120 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
31130 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
31140 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
31150 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
31160 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
31170 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
31180 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
31190 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
311a0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
311b0 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
311c0 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
311d0 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311f0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
31200 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
31210 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
31220 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
31230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31240 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
31250 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
31260 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
31270 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
31280 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
31290 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
312a0 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
312b0 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
312c0 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
312d0 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
312e0 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
312f0 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
31300 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
31310 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
31320 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
31330 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
31340 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
31350 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
31360 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
31370 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
31380 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
31390 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
313a0 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20   the sorter */. 
313b0 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47 72     int orderByGr
313c0 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69  p = 0; /* True i
313d0 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61  f the GROUP BY a
313e0 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65 20  nd ORDER BY are 
313f0 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20  the same */..   
31400 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61   /* Remove any a
31410 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62  nd all aliases b
31420 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c  etween the resul
31430 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20  t set and the.  
31440 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c    ** GROUP BY cl
31450 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ause..    */.   
31460 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
31470 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20  .      int k;   
31480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31490 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
314a0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74  nter */.      st
314b0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
314c0 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46  em *pItem;  /* F
314d0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
314e0 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20  expression in a 
314f0 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66  list */..      f
31500 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  or(k=p->pEList->
31510 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e  nExpr, pItem=p->
31520 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20  pEList->a; k>0; 
31530 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  k--, pItem++){. 
31540 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
31550 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  x.iAlias = 0;.  
31560 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
31570 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  k=pGroupBy->nExp
31580 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  r, pItem=pGroupB
31590 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  y->a; k>0; k--, 
315a0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
315b0 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
315c0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
315d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 36  .      assert( 6
315e0 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  6==sqlite3LogEst
315f0 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20 69  (100) );.      i
31600 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
31610 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  >66 ) p->nSelect
31620 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65  Row = 66;.    }e
31630 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
31640 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  t( 0==sqlite3Log
31650 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20 20  Est(1) );.      
31660 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
31670 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
31680 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74   If there is bot
31690 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64  h a GROUP BY and
316a0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
316b0 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65  use and they are
316c0 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63 61  .    ** identica
316d0 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 62  l, then it may b
316e0 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 69  e possible to di
316f0 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20  sable the ORDER 
31700 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20 2a  BY clause .    *
31710 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64 73  * on the grounds
31720 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50 20   that the GROUP 
31730 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  BY will cause el
31740 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
31750 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ut .    ** in th
31760 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
31770 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74   It also may not
31780 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59 20   - the GROUP BY 
31790 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20 20  might use a.    
317a0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  ** database inde
317b0 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f  x that causes ro
317c0 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65 64  ws to be grouped
317d0 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65 71   together as req
317e0 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75 74  uired.    ** but
317f0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73 6f   not actually so
31800 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61 79  rted. Either way
31810 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  , record the fac
31820 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  t that the.    *
31830 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47  * ORDER BY and G
31840 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20  ROUP BY clauses 
31850 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79 20  are the same by 
31860 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64 65  setting the orde
31870 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76 61  rByGrp.    ** va
31880 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  riable.  */.    
31890 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
318a0 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f 75  istCompare(pGrou
318b0 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  pBy, sSort.pOrde
318c0 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  rBy, -1)==0 ){. 
318d0 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70 20       orderByGrp 
318e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20  = 1;.    }. .   
318f0 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62   /* Create a lab
31900 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68  el to jump to wh
31910 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62  en we want to ab
31920 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f  ort the query */
31930 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73  .    addrEnd = s
31940 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
31950 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20  bel(v);..    /* 
31960 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d  Convert TK_COLUM
31970 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f  N nodes into TK_
31980 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d  AGG_COLUMN and m
31990 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  ake entries in. 
319a0 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66     ** sAggInfo f
319b0 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55  or all TK_AGG_FU
319c0 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20  NCTION nodes in 
319d0 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  expressions of t
319e0 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  he.    ** SELECT
319f0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
31a00 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
31a10 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
31a20 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
31a30 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
31a40 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
31a50 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73   pTabList;.    s
31a60 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
31a70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67  AggInfo;.    sAg
31a80 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50  gInfo.mnReg = pP
31a90 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
31aa0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74    sAggInfo.nSort
31ab0 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f  ingColumn = pGro
31ac0 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d  upBy ? pGroupBy-
31ad0 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
31ae0 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42  sAggInfo.pGroupB
31af0 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20  y = pGroupBy;.  
31b00 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
31b10 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
31b20 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73  , pEList);.    s
31b30 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
31b40 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
31b50 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b 0a  Sort.pOrderBy);.
31b60 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20      if( pHaving 
31b70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47 72  ){.      if( pGr
31b80 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
31b90 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65 3d   assert( pWhere=
31ba0 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20 20  =p->pWhere );.  
31bb0 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57 68        havingToWh
31bc0 65 72 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ere(pParse, pGro
31bd0 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 26  upBy, pHaving, &
31be0 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
31bf0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
31c00 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a  pWhere;.      }.
31c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
31c20 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
31c30 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
31c40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
31c50 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
31c60 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
31c70 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
31c80 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
31c90 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
31ca0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
31cb0 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
31cc0 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
31cd0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
31ce0 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
31cf0 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
31d00 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
31d10 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
31d20 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
31d30 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
31d40 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
31d50 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
31d60 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
31d70 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
31d80 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
31d90 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
31da0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
31db0 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
31dc0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
31dd0 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
31de0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
31df0 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
31e00 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
31e10 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
31e20 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
31e30 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
31e40 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
31e50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
31e60 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
31e70 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
31e80 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
31e90 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
31ea0 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
31eb0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
31ec0 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r1;          /* 
31ed0 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
31ee0 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
31ef0 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
31f00 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
31f10 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
31f20 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
31f30 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
31f40 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
31f50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
31f60 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
31f70 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
31f80 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
31f90 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
31fa0 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
31fb0 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
31fc0 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
31fd0 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
31fe0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
31ff0 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
32000 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
32010 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
32020 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
32030 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
32040 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
32050 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
32060 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
32070 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
32080 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
32090 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
320a0 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
320b0 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
320c0 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
320d0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
320e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
320f0 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
32100 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
32110 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
32120 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
32130 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
32140 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
32150 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
32160 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
32170 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
32180 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
32190 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
321a0 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
321b0 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
321c0 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
321d0 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
321e0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
321f0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
32200 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
32210 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
32220 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
32230 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
32240 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  se, pGroupBy, 0,
32250 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
32260 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  n);.      addrSo
32270 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
32280 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
32290 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
322a0 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
322b0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
322c0 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
322d0 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
322e0 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
322f0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
32300 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  O);..      /* In
32310 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
32320 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
32330 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
32340 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
32350 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
32360 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
32370 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
32380 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
32390 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
323a0 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
323b0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
323c0 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
323d0 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
323e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
323f0 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20  .      regReset 
32400 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
32410 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  ;.      addrRese
32420 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
32430 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
32440 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
32450 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
32460 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
32470 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
32480 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
32490 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
324a0 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
324b0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
324c0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
324d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
324e0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
324f0 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
32500 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
32510 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
32520 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
32530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32540 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
32550 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
32560 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
32570 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
32580 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
32590 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
325a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
325b0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
325c0 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
325d0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
325e0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
325f0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
32600 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
32610 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
32620 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
32630 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
32640 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
32650 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
32660 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
32670 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
32680 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
32690 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
326a0 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
326b0 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
326c0 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
326d0 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
326e0 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
326f0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
32700 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32710 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
32720 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
32730 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
32740 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
32750 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
32760 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
32770 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20  , pGroupBy, 0,. 
32780 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47           WHERE_G
32790 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42  ROUPBY | (orderB
327a0 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52  yGrp ? WHERE_SOR
327b0 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30  TBYGROUP : 0), 0
327c0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
327d0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
327e0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
327f0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
32800 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
32810 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70  (pWInfo)==pGroup
32820 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
32830 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69       /* The opti
32840 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f  mizer is able to
32850 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e   deliver rows in
32860 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20   group by order 
32870 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65  so.        ** we
32880 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
32890 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70  sort.  The OP_Op
328a0 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  enEphemeral tabl
328b0 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  e will be.      
328c0 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c    ** cancelled l
328d0 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20  ater because we 
328e0 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73  still need to us
328f0 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20  e the pKeyInfo. 
32900 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32910 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
32920 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
32930 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
32940 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69  are coming out i
32950 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f  n undetermined o
32960 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74  rder.  We have t
32970 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a  o push.        *
32980 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20  * each row into 
32990 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c  a sorting index,
329a0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66   terminate the f
329b0 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20  irst loop,.     
329c0 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20     ** then loop 
329d0 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67  over the sorting
329e0 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20   index in order 
329f0 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  to get the outpu
32a00 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
32a10 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20  sorted order.   
32a20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32a30 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20  int regBase;.   
32a40 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f       int regReco
32a50 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rd;.        int 
32a60 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e  nCol;.        in
32a70 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20  t nGroupBy;..   
32a80 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70       explainTemp
32a90 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20  Table(pParse, . 
32aa0 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73             (sDis
32ab0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
32ac0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  (p->selFlags&SF_
32ad0 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a  Distinct)==0) ?.
32ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32af0 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a      "DISTINCT" :
32b00 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20   "GROUP BY");.. 
32b10 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f         groupBySo
32b20 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rt = 1;.        
32b30 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  nGroupBy = pGrou
32b40 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
32b50 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75      nCol = nGrou
32b60 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  pBy;.        j =
32b70 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
32b80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
32b90 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
32ba0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
32bb0 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  if( sAggInfo.aCo
32bc0 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75  l[i].iSorterColu
32bd0 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20  mn>=j ){.       
32be0 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20       nCol++;.   
32bf0 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
32c00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32c10 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42    }.        regB
32c20 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ase = sqlite3Get
32c30 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
32c40 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
32c50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
32c60 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
32c70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
32c80 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
32c90 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
32ca0 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29  , regBase, 0, 0)
32cb0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
32cc0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
32cd0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
32ce0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
32cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
32d00 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
32d10 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66  *pCol = &sAggInf
32d20 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20  o.aCol[i];.     
32d30 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69       if( pCol->i
32d40 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20  SorterColumn>=j 
32d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
32d60 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42  nt r1 = j + regB
32d70 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ase;.           
32d80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
32d90 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70  GetColumnToReg(p
32da0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dc0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
32dd0 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e  b, pCol->iColumn
32de0 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20  , pCol->iTable, 
32df0 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
32e00 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
32e10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32e20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
32e30 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
32e40 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
32e50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32e60 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
32e70 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
32e80 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
32e90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32ea0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
32eb0 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20  P_SorterInsert, 
32ec0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
32ed0 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Idx, regRecord);
32ee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32ef0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
32f00 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
32f10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32f20 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
32f30 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61  ge(pParse, regBa
32f40 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
32f50 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
32f60 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
32f70 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
32f80 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f  tingIdxPTab = so
32f90 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d  rtPTab = pParse-
32fa0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
32fb0 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74   sortOut = sqlit
32fc0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
32fd0 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
32fe0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
32ff0 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
33000 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74  , sortPTab, sort
33010 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  Out, nCol);.    
33020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33030 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
33040 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f  erSort, sAggInfo
33050 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
33060 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56  rEnd);.        V
33070 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
33080 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29  GROUP BY sort"))
33090 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
330a0 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
330b0 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64  nfo.useSortingId
330c0 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73  x = 1;.        s
330d0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
330e0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20  lear(pParse);.. 
330f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
33100 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72   If the index or
33110 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
33120 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f   used by the GRO
33130 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20  UP BY sort.     
33140 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c   ** will natural
33150 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  ly deliver rows 
33160 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71  in the order req
33170 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44  uired by the ORD
33180 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63  ER BY.      ** c
33190 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68  lause, cancel th
331a0 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  e ephemeral tabl
331b0 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72  e open coded ear
331c0 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  lier..      **. 
331d0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
331e0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
331f0 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  - the correct an
33200 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75  swer should resu
33210 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  lt regardless.. 
33220 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20       ** Use the 
33230 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
33240 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
33250 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
33260 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20  TIMIZER to .    
33270 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69    ** disable thi
33280 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  s optimization f
33290 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
332a0 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ses.  */.      i
332b0 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26  f( orderByGrp &&
332c0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
332d0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
332e0 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20  GroupByOrder) . 
332f0 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42        && (groupB
33300 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33  ySort || sqlite3
33310 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57  WhereIsSorted(pW
33320 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a  Info)).      ){.
33330 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
33340 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
33350 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
33360 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
33370 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
33380 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ex);.      }..  
33390 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
333a0 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
333b0 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
333c0 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
333d0 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
333e0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
333f0 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
33400 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
33410 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
33420 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
33430 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
33440 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
33450 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
33460 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
33470 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
33480 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
33490 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
334a0 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
334b0 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
334c0 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
334d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
334e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
334f0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
33500 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
33510 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
33520 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33530 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
33540 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
33550 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
33560 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
33570 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74              sort
33580 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a  Out, sortPTab);.
33590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
335a0 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42  r(j=0; j<pGroupB
335b0 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  y->nExpr; j++){.
335c0 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75          if( grou
335d0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
335e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
335f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
33600 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a  umn, sortPTab, j
33610 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
33620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33630 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69       sAggInfo.di
33640 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20  rectMode = 1;.  
33650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
33660 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
33670 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70  pGroupBy->a[j].p
33680 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a  Expr, iBMem+j);.
33690 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
336a0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
336b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
336c0 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20  Compare, iAMem, 
336d0 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d  iBMem, pGroupBy-
336e0 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
336f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33700 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
33710 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
33720 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
33730 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
33740 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
33750 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
33760 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33770 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
33780 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72  addr1+1, 0, addr
33790 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
337a0 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge(v);..      /*
337b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
337c0 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65  hat runs wheneve
337d0 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  r the GROUP BY c
337e0 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a  hanges..      **
337f0 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20   Changes in the 
33800 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74  GROUP BY are det
33810 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65  ected by the pre
33820 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20  vious code.     
33830 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74   ** block.  If t
33840 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61  here were no cha
33850 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b  nges, this block
33860 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   is skipped..   
33870 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
33880 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20  his code copies 
33890 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79  current group by
338a0 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c   terms in b0,b1,
338b0 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  b2,....      ** 
338c0 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32  over to a0,a1,a2
338d0 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73  .  It then calls
338e0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
338f0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
33900 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61  and resets the a
33910 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
33920 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69  ator registers i
33930 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20  n preparation.  
33940 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e      ** for the n
33950 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74  ext GROUP BY bat
33960 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ch..      */.   
33970 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
33980 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  deMove(pParse, i
33990 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72  BMem, iAMem, pGr
339a0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20  oupBy->nExpr);. 
339b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
339c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
339d0 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
339e0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
339f0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
33a00 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
33a10 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20  one row"));.    
33a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33a30 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
33a40 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64   iAbortFlag, add
33a50 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72  rEnd); VdbeCover
33a60 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
33a70 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
33a80 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
33a90 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
33aa0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33ab0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
33ac0 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
33ad0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
33ae0 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
33af0 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
33b00 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
33b10 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
33b20 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
33b30 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
33b40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
33b50 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
33b60 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
33b70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
33b80 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64  ddr1);.      upd
33b90 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
33ba0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
33bb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33bc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
33bd0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73  _Integer, 1, iUs
33be0 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
33bf0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
33c00 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20  ndicate data in 
33c10 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
33c20 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  .      /* End of
33c30 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20   the loop.      
33c40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  */.      if( gro
33c50 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
33c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33c70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
33c80 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f  erNext, sAggInfo
33c90 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64  .sortingIdx, add
33ca0 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20  rTopOfLoop);.   
33cb0 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
33cc0 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(v);.      }els
33cd0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
33ce0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
33cf0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
33d00 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
33d10 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
33d20 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
33d30 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
33d40 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
33d50 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
33d60 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
33d70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
33d80 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
33d90 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
33da0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
33db0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
33dc0 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
33dd0 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
33de0 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
33df0 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
33e00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
33e10 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  oto(v, addrEnd);
33e20 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
33e30 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
33e40 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
33e50 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
33e60 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
33e70 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
33e80 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
33e90 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
33ea0 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
33eb0 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
33ec0 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
33ed0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
33ee0 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
33ef0 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
33f00 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
33f10 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
33f20 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
33f30 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
33f40 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
33f50 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
33f60 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
33f70 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
33f80 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
33f90 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
33fa0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
33fb0 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
33fc0 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
33fd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
33fe0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
33ff0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34000 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
34010 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
34020 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
34030 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
34040 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
34050 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34060 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
34070 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
34080 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34090 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
340a0 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  (v, addrOutputRo
340b0 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  w);.      addrOu
340c0 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
340d0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
340e0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
340f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34100 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
34110 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
34120 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
34130 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
34140 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
34150 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75  v, "Groupby resu
34160 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74  lt generator ent
34170 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20  ry point"));.   
34180 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34190 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
341a0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
341b0 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65  ;.      finalize
341c0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61  AggFunctions(pPa
341d0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
341e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
341f0 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
34200 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f  , pHaving, addrO
34210 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49  utputRow+1, SQLI
34220 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
34230 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
34240 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
34250 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
34260 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20  &sSort,.        
34270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
34280 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
34290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
342a0 20 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75         addrOutpu
342b0 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41  tRow+1, addrSetA
342c0 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  bort);.      sql
342d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
342e0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
342f0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
34300 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
34310 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72  , "end groupby r
34320 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22  esult generator"
34330 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  ));..      /* Ge
34340 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
34350 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
34360 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79  set the group-by
34370 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20   accumulator.   
34380 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
34390 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
343a0 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74  bel(v, addrReset
343b0 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  );.      resetAc
343c0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
343d0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
343e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
343f0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
34400 72 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20  rn, regReset);. 
34410 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e      .    } /* en
34420 64 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42  dif pGroupBy.  B
34430 65 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71  egin aggregate q
34440 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47  ueries without G
34450 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20  ROUP BY: */.    
34460 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70  else {.      Exp
34470 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b  rList *pDel = 0;
34480 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34490 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a  OMIT_BTREECOUNT.
344a0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
344b0 62 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  b;.      if( (pT
344c0 61 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75  ab = isSimpleCou
344d0 6e 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29  nt(p, &sAggInfo)
344e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
344f0 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f  /* If isSimpleCo
34500 75 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20  unt() returns a 
34510 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62  pointer to a Tab
34520 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  le structure, th
34530 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
34540 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
34550 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
34560 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
34570 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63     **   SELECT c
34580 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
34590 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  l>.        **.  
345a0 20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74        ** where t
345b0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
345c0 72 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72  re returned repr
345d0 65 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62  esents table <tb
345e0 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  l>..        **. 
345f0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73         ** This s
34600 74 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63  tatement is so c
34610 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73  ommon that it is
34620 20 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69   optimized speci
34630 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20  ally. The.      
34640 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e    ** OP_Count in
34650 73 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65  struction is exe
34660 63 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20  cuted either on 
34670 74 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65  the intkey table
34680 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
34690 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
346a0 74 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62  ta for table <tb
346b0 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20  l> or on one of 
346c0 69 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a  its indexes. It.
346d0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65          ** is be
346e0 74 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20  tter to execute 
346f0 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64  the op on an ind
34700 65 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61  ex, as indexes a
34710 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20  re almost.      
34720 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65    ** always spre
34730 61 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70  ad across less p
34740 61 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20  ages than their 
34750 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
34760 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
34770 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
34780 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
34790 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
347a0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
347b0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
347c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72    const int iCsr
347d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
347e0 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  +;     /* Cursor
347f0 20 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20   to scan b-tree 
34800 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
34810 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
34820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34830 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
34840 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
34850 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
34860 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
34870 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20       /* Keyinfo 
34880 66 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65  for scanned inde
34890 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64  x */.        Ind
348a0 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20  ex *pBest = 0;  
348b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
348c0 20 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20    /* Best index 
348d0 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a  found so far */.
348e0 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f          int iRoo
348f0 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20  t = pTab->tnum; 
34900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34910 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61  Root page of sca
34920 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  nned b-tree */..
34930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
34940 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
34950 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
34960 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
34970 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
34980 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
34990 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
349a0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61  ..        /* Sea
349b0 72 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65  rch for the inde
349c0 78 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c  x that has the l
349d0 6f 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e  owest scan cost.
349e0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
349f0 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
34a00 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
34a10 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
34a20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
34a30 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
34a40 20 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d      ** (2013-10-
34a50 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74  03) Do not count
34a60 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20   the entries in 
34a70 61 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e  a partial index.
34a80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
34a90 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
34aa0 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
34ab0 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
34ac0 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
34ad0 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
34ae0 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
34af0 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
34b00 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
34b10 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
34b20 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65  owid(pTab) ) pBe
34b30 73 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  st = sqlite3Prim
34b40 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
34b50 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
34b60 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
34b70 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
34b80 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
34b90 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62       if( pIdx->b
34ba0 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
34bb0 20 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d          && pIdx-
34bc0 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e  >szIdxRow<pTab->
34bd0 73 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20  szTabRow.       
34be0 20 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61      && pIdx->pPa
34bf0 72 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20  rtIdxWhere==0.  
34c00 20 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42           && (!pB
34c10 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49  est || pIdx->szI
34c20 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49  dxRow<pBest->szI
34c30 64 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20  dxRow).         
34c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34c50 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
34c60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34c70 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
34c80 70 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pBest ){.       
34c90 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74     iRoot = pBest
34ca0 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  ->tnum;.        
34cb0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
34cc0 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64  ite3KeyInfoOfInd
34cd0 65 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74  ex(pParse, pBest
34ce0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
34cf0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20        /* Open a 
34d00 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
34d10 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50  , execute the OP
34d20 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68  _Count, close th
34d30 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20  e cursor. */.   
34d40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34d50 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
34d60 4f 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20  OpenRead, iCsr, 
34d70 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a  iRoot, iDb, 1);.
34d80 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
34d90 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
34da0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
34db0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
34dc0 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  ar *)pKeyInfo, P
34dd0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
34de0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
34df0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
34e00 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73  v, OP_Count, iCs
34e10 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  r, sAggInfo.aFun
34e20 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20  c[0].iMem);.    
34e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34e40 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
34e50 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20  e, iCsr);.      
34e60 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43    explainSimpleC
34e70 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61  ount(pParse, pTa
34e80 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  b, pBest);.     
34e90 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
34ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
34eb0 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20  EECOUNT */.     
34ec0 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68   {.        /* Ch
34ed0 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79  eck if the query
34ee0 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
34ef0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
34f00 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
34f10 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
34f20 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e  T min(x) FROM ..
34f30 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  ..        **   S
34f40 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
34f50 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  M ....        **
34f60 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69  .        ** If i
34f70 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
34f80 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
34f90 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
34fa0 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
34fb0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74        ** as if t
34fc0 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44  here was an "ORD
34fd0 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44  ER ON x" or "ORD
34fe0 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c  ER ON x DESC" cl
34ff0 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a  ause. .        *
35000 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20  * If where.c is 
35010 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20  able to produce 
35020 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69  results sorted i
35030 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68  n this order, th
35040 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  en.        ** ad
35050 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62  d vdbe code to b
35060 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
35070 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20  processing loop 
35080 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20  after the .     
35090 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72     ** first iter
350a0 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65  ation (since the
350b0 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
350c0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20   of the loop is 
350d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72  .        ** guar
350e0 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74  anteed to operat
350f0 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74  e on the row wit
35100 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72  h the minimum or
35110 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20   maximum .      
35120 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
35130 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
35140 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20  quired)..       
35150 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41   **.        ** A
35160 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
35170 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
35180 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
35190 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
351a0 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66          ** modif
351b0 79 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f  y behavior as fo
351c0 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a  llows:.        *
351d0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b  *.        **   +
351e0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
351f0 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
35200 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f  )", then the loo
35210 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20  p coded by.     
35220 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e     **     where.
35230 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65  c should not ite
35240 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61  rate over any va
35250 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c  lues with a NULL
35260 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a   value.        *
35270 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20  *     for x..   
35280 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
35290 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d  **   + The optim
352a0 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65  izer code in whe
352b0 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20  re.c (the thing 
352c0 74 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69  that decides whi
352d0 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ch.        **   
352e0 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63    index or indic
352f0 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c  es to use) shoul
35300 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72  d place a differ
35310 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20  ent priority on 
35320 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
35330 73 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27  satisfying the '
35340 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65  ORDER BY' clause
35350 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e   than it does in
35360 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20   other cases..  
35370 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66        **     Ref
35380 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63  er to code and c
35390 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65  omments in where
353a0 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  .c for details..
353b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
353c0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69     ExprList *pMi
353d0 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nMax = 0;.      
353e0 20 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52    u8 flag = WHER
353f0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
35400 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
35410 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47     assert( p->pG
35420 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20  roupBy==0 );.   
35430 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
35440 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
35450 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d  if( p->pHaving==
35460 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
35470 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
35480 79 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d  y(&sAggInfo, &pM
35490 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20  inMax);.        
354a0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
354b0 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d  ( flag==0 || (pM
354c0 69 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e  inMax!=0 && pMin
354d0 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29  Max->nExpr==1) )
354e0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  ;..        if( f
354f0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
35500 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74   pMinMax = sqlit
35510 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
35520 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20  , pMinMax, 0);. 
35530 20 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20           pDel = 
35540 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20  pMinMax;.       
35550 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
35560 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
35570 4d 69 6e 4d 61 78 21 3d 30 20 29 3b 0a 20 20 20  MinMax!=0 );.   
35580 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
35590 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
355a0 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
355b0 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
355c0 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
355d0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31  E_ORDERBY_MIN ?1
355e0 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0;.            
355f0 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45  pMinMax->a[0].pE
35600 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
35610 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UMN;.          }
35620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
35630 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
35640 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
35650 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
35660 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
35670 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
35680 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
35690 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
356a0 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
356b0 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
356c0 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
356d0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
356e0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
356f0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
35700 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
35710 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
35720 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
35730 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
35740 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c  pWhere, pMinMax,
35750 20 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20   0,flag,0);.    
35760 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
35770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
35780 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
35790 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
357a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
357b0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
357c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
357d0 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
357e0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
357f0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
35800 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c  t( pMinMax==0 ||
35810 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
35820 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =1 );.        if
35830 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
35840 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e  Ordered(pWInfo)>
35850 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
35860 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
35870 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
35880 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
35890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
358a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
358b0 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
358c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
358d0 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
358e0 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
358f0 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
35900 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35910 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
35920 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
35930 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
35940 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
35950 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
35960 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
35970 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
35980 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
35990 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20  Parse, pHaving, 
359a0 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f  addrEnd, SQLITE_
359b0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
359c0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
359d0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
359e0 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20  >pEList, -1, 0, 
359f0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
35a00 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c            pDest,
35a10 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e   addrEnd, addrEn
35a20 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
35a30 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
35a40 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d  db, pDel);.    }
35a50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
35a60 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
35a70 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20  addrEnd);.    . 
35a80 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72   } /* endif aggr
35a90 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a  egate query */..
35aa0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
35ab0 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45  eTnctType==WHERE
35ac0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
35ad0 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  RED ){.    expla
35ae0 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
35af0 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b  se, "DISTINCT");
35b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
35b10 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
35b20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
35b30 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20  we need to sort 
35b40 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a  the results.  **
35b50 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74   and send them t
35b60 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  o the callback o
35b70 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  ne by one..  */.
35b80 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
35b90 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c  erBy ){.    expl
35ba0 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
35bb0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
35bc0 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
35bd0 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48  nOBSat>0 ? "RIGH
35be0 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20  T PART OF ORDER 
35bf0 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b  BY":"ORDER BY");
35c00 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
35c10 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
35c20 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d   &sSort, pEList-
35c30 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
35c40 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
35c50 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
35c60 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
35c70 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
35c80 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
35c90 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
35ca0 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e   has been coded.
35cb0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
35cc0 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72  error in the Par
35cd0 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20  se structure,.  
35ce0 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74 75 72  ** set the retur
35cf0 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68  n code to 1. Oth
35d00 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72  erwise 0. */.  r
35d10 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72  c = (pParse->nEr
35d20 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74  r>0);..  /* Cont
35d30 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72  rol jumps to her
35d40 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
35d50 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f   encountered abo
35d60 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a  ve, or upon.  **
35d70 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69   successful codi
35d80 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ng of the SELECT
35d90 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e  ..  */.select_en
35da0 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49  d:.  explainSetI
35db0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
35dc0 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
35dd0 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20  reSelectId);..  
35de0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
35df0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
35e00 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
35e10 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
35e20 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43  Func);.#if SELEC
35e30 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
35e40 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
35e50 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72  Parse,p,("end pr
35e60 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20  ocessing\n"));. 
35e70 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
35e80 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
35e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.