/ Hex Artifact Content
Login

Artifact 30805a1bc0236ba70a9a1592af4a7c522f906c6bfeba44c165046e592a3a36ec:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1000: 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1010: 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53  e->db,TK_ASTERIS
1020: 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  K,0));.  }.  pNe
1030: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  w->pEList = pELi
1040: 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  st;.  pNew->op =
1050: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e   TK_SELECT;.  pN
1060: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73  ew->selFlags = s
1070: 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  elFlags;.  pNew-
1080: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
1090: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
10a0: 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
10b0: 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77  E_ENABLED.  pNew
10c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20  ->zSelName[0] = 
10d0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65 77  0;.#endif.  pNew
10e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
10f0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1100: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
1110: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
1120: 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
1130: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1140: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1150: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
1160: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72  >db, sizeof(*pSr
1170: 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  c));.  pNew->pSr
1180: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
1190: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
11a0: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
11b0: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
11c0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
11d0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
11e0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
11f0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
1200: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1210: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
1220: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1230: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
1240: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1250: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  t;.  pNew->pWith
1260: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1270: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
1280: 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  imit!=0 || pPars
1290: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 50 61  e->nErr>0 || pPa
12a0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12b0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
12c0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
12e0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
12f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1300: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29   pNew!=&standin)
1310: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1330: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
1340: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
1350: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
1360: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
1370: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
1380: 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45   pNew;.}..#if SE
1390: 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
13a0: 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  D./*.** Set the 
13b0: 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74  name of a Select
13c0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
13d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
13e0: 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20  Name(Select *p, 
13f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1400: 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a  e){.  if( p && z
1410: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1420: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1430: 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  eof(p->zSelName)
1440: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22  , p->zSelName, "
1450: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
1460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1470: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
1480: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
1490: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
14a0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
14b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
14d0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
14e0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
14f0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
1500: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
1510: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1520: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
1530: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1540: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
1550: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1560: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1570: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1580: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1590: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
15a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
15b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
15c0: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
15d0: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
15e0: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
15f0: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
1600: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
1610: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
1620: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
1630: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
1640: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1660: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1670: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1680: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1690: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
16a0: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
16b0: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
16c0: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
16d0: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
16e0: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
16f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
1700: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
1710: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
1720: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
1730: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
1740: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
1750: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1760: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1770: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1780: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1790: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17a0: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
17b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
17c0: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
17d0: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
17e0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
17f0: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
1800: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1830: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
1840: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1850: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1860: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1870: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1880: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1890: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
18a0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
18b0: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
18c0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
18d0: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
18e0: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
18f0: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
1900: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
1910: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
1920: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
1930: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
1940: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
1950: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1960: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1970: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1980: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
19a0: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
19b0: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
19c0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
19e0: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
19f0: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a10: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
1a20: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
1a30: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
1a50: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1a60: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1a70: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1a80: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1a90: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1ac0: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1ae0: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1af0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
1b00: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
1b10: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
1b20: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
1b30: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
1b40: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1b50: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1b60: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1b70: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1b80: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1b90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1ba0: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1bb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1bc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1bd0: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1be0: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1bf0: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1c10: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1c20: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c40: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1c50: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1c60: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1c70: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1c80: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1c90: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1ca0: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1cb0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1cc0: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ce0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1cf0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1d00: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1d10: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1d20: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1d30: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1d40: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1d50: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1d60: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1d70: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1d80: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1d90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1db0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1dc0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1dd0: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1de0: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1df0: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1e00: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1e10: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1e20: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1e30: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1e40: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1e50: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1e60: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1e90: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1ea0: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1eb0: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1ec0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1ed0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1ee0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1ef0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1f00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f10: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1f20: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1f30: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1f40: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1f50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1f60: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1f80: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1f90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fa0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1fc0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fe0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1ff0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
2000: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
2010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2030: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
2040: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
2050: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
2060: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
2070: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
2080: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
2090: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
20a0: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
20b0: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
20c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
20d0: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
20e0: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
20f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
2100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
2110: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
2120: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
2130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
2140: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2150: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2160: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2170: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2180: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2190: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
21a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
21b0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
21c0: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
21e0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
21f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
2200: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2210: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2230: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2240: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
2250: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2260: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2270: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2280: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2290: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
22a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22c0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22d0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
22e0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
22f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2300: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
2310: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
2320: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
2330: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
2340: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
2350: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2360: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2370: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2380: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2390: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
23a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
23b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
23c0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
23d0: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
23e0: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
23f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2400: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2430: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2440: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
2450: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2460: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2470: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2480: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2490: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
24a0: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
24b0: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
24c0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
24d0: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
24e0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
24f0: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
2500: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
2510: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
2520: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
2530: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
2540: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
2550: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2560: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2570: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2580: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2590: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
25a0: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
25b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
25c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
25d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2600: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2610: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2630: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
2640: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2650: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2680: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2690: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
26a0: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
26d0: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2710: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
2720: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2730: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
2740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2750: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2760: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2770: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2780: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
27b0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
27c0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27e0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
27f0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
2800: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2820: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
2830: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
2840: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
2850: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2890: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
28a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
28b0: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
28c0: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
28d0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28e0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28f0: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
2900: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
2910: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2920: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
2930: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
2940: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
2950: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2960: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a  _EQ, pE1, pE2);.
2970: 20 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f    if( pEq && isO
2980: 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  uterJoin ){.    
2990: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
29a0: 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  pEq, EP_FromJoin
29b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
29c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29d0: 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  pEq, EP_TokenOnl
29e0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
29f0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2a20: 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  Eq->iRightJoinTa
2a30: 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e  ble = (i16)pE2->
2a40: 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  iTable;.  }.  *p
2a50: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2a60: 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57  ExprAnd(db, *ppW
2a70: 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f  here, pEq);.}../
2a80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
2a90: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2aa0: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
2ab0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2ac0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
2ad0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
2ae0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
2af0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
2b00: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
2b10: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2b20: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
2b30: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
2b40: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
2b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
2b60: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
2b70: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
2b80: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
2b90: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
2ba0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2bb0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2bc0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2bd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2be0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2bf0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2c00: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2c10: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
2c20: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
2c30: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
2c40: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
2c50: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
2c60: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
2c70: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
2c80: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
2c90: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2ca0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
2cb0: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
2cc0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
2cd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2ce0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2cf0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2d00: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
2d10: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
2d20: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
2d30: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
2d40: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
2d50: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
2d60: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
2d70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
2d80: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
2d90: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
2da0: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
2db0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
2dc0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
2dd0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
2de0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
2df0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
2e00: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e10: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
2e20: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
2e30: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
2e40: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
2e50: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
2e60: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
2e70: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
2e80: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
2e90: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
2ea0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2eb0: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2ec0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2ed0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2ee0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2ef0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2f00: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2f10: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2f20: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2f30: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
2f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2f50: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
2f60: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
2f70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
2f80: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2f90: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
2fa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2fb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2fc0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
2fd0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2fe0: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2ff0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
3000: 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52  duce);.    p->iR
3010: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
3020: 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20  (i16)iTable;.   
3030: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3040: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3050: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3060: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3070: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3080: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3090: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45          setJoinE
30a0: 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  xpr(p->x.pList->
30b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
30c0: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
30d0: 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78   }.    setJoinEx
30e0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
30f0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
3100: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3110: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3120: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3130: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3140: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3160: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3170: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3180: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3190: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
31a0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
31b0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
31c0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
31d0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
31e0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
31f0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
3200: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3210: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3220: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3230: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3240: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3250: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3260: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3270: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3280: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3290: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
32a0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
32b0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
32c0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
32d0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
32e0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
32f0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
3300: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3310: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3320: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3330: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3340: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3350: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3360: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3370: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3380: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
33a0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
33b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
33d0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
33e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
33f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3420: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3430: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3460: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3470: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3480: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3490: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
34a0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
34b0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34c0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
34d0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
34e0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
34f0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3500: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3510: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3520: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3530: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3540: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3550: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3560: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
3570: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
3580: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3590: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
35a0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
35b0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
35c0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
35d0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
35e0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
35f0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3600: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3610: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3620: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3630: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3640: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3650: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3660: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3670: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3680: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3690: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
36a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36b0: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
36c0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
36d0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
36e0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
36f0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3720: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3730: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3740: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3750: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3760: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3780: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3790: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
37a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
37b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
37c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
37d0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
37e0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37f0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3800: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3810: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3820: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3830: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3840: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3850: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3860: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3870: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3880: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3890: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
38a0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
38b0: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
38c0: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
38d0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
38e0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
38f0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3900: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3930: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3950: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3960: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3970: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3980: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3990: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
39a0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
39b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
39c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
39d0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
39e0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
39f0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3a00: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3a10: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3a20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
3a40: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
3a50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3a60: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
3a70: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
3a80: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
3a90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
3aa0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
3ab0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
3ac0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
3ad0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
3ae0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
3af0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
3b00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
3b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3b20: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
3b30: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
3b40: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
3b50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3b60: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
3b70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b80: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3b90: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
3ba0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3bb0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
3bc0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3bd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
3be0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
3bf0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
3c00: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
3c10: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
3c20: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
3c30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3c40: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
3c50: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
3c60: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
3c70: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
3c80: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
3c90: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
3ca0: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
3cb0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
3cc0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
3cd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
3ce0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3cf0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3d00: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
3d10: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
3d20: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
3d30: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
3d40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
3d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3d70: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
3d80: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
3d90: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3da0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
3db0: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
3dc0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
3dd0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
3de0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
3df0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e00: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e10: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
3e20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e30: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
3e40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3e50: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3e60: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
3e70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3e80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
3ea0: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
3eb0: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
3ec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
3ed0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
3ee0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
3ef0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3f00: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3f10: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3f20: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
3f30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3f40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f50: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
3f60: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
3f70: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
3f80: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
3f90: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
3fa0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fd0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3fe0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3ff0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
4000: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4030: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4050: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
4060: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
4070: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
4080: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
4090: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
40a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
40b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
40c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
40d0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
40e0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
40f0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
4100: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
4110: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
4120: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
4130: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
4140: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
4150: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
4160: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
4170: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
4180: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a  o the end */.);.
4190: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
41a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70  code that will p
41b0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69  ush the record i
41c0: 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44  n registers regD
41d0: 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72  ata.** through r
41e0: 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f  egData+nData-1 o
41f0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
4200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4210: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
4220: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4230: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4240: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4250: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4270: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f  tion about the O
4280: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
4290: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
42a0: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
42b0: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
42c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
42d0: 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20  t regData,      
42e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
42f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4300: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
4310: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
4320: 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20  gData,       /* 
4330: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4340: 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f  olding data befo
4350: 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20  re packing */.  
4360: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
4370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4380: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
4390: 74 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a  the data array *
43a0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
43b0: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
43c0: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
43d0: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
43e0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
43f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4400: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4430: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4440: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
4450: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
4460: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4470: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
4480: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
4490: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
44a0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
44b0: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
44c0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
44d0: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
44e0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
4510: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4520: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
4560: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4570: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
4580: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
45b0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
45c0: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
45d0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
4600: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
4610: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
4640: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
4650: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
4660: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
4690: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
46a0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
46b0: 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Seq==1 );.  asse
46c0: 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20  rt( nData==1 || 
46d0: 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67  regData==regOrig
46e0: 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44  Data || regOrigD
46f0: 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
4700: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
4710: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
4720: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
4730: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
4740: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70  = regData - nExp
4750: 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73  r - bSeq;.  }els
4760: 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  e{.    regBase =
4770: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
4780: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
4790: 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20  Mem += nBase;.  
47a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  }.  assert( pSel
47b0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20  ect->iOffset==0 
47c0: 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  || pSelect->iLim
47d0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69  it!=0 );.  iLimi
47e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  t = pSelect->iOf
47f0: 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e  fset ? pSelect->
4800: 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c  iOffset+1 : pSel
4810: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70  ect->iLimit;.  p
4820: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20  Sort->labelDone 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c  eLabel(v);.  sql
4850: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4860: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
4870: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  rt->pOrderBy, re
4880: 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61  gBase, regOrigDa
4890: 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
48b0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20  LITE_ECEL_DUP | 
48c0: 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51  (regOrigData? SQ
48d0: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20  LITE_ECEL_REF : 
48e0: 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  0));.  if( bSeq 
48f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4900: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4910: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4920: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4930: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
4940: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
4950: 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a  0 && nData>0 ){.
4960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4970: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
4980: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
4990: 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61  +nExpr+bSeq, nDa
49a0: 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ta);.  }.  sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
49c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
49d0: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
49e0: 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67  Base-nOBSat, reg
49f0: 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e  Record);.  if( n
4a00: 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69  OBSat>0 ){.    i
4a10: 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20  nt regPrevKey;  
4a20: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f   /* The first nO
4a30: 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  BSat columns of 
4a40: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
4a50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4a60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64  First;    /* Add
4a70: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49  ress of the OP_I
4a80: 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  fNot opcode */. 
4a90: 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20     int addrJmp; 
4aa0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4ab0: 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f  of the OP_Jump o
4ac0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62  pcode */.    Vdb
4ad0: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f  eOp *pOp;      /
4ae0: 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70  * Opcode that op
4af0: 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a  ens the sorter *
4b00: 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20  /.    int nKey; 
4b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b20: 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79  r of sorting key
4b30: 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64   columns, includ
4b40: 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  ing OP_Sequence 
4b50: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
4b60: 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  pKI;     /* Orig
4b70: 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20  inal KeyInfo on 
4b80: 74 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65  the sorter table
4b90: 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76   */..    regPrev
4ba0: 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Key = pParse->nM
4bb0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4bc0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d  ->nMem += pSort-
4bd0: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65  >nOBSat;.    nKe
4be0: 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72  y = nExpr - pSor
4bf0: 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71  t->nOBSat + bSeq
4c00: 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29  ;.    if( bSeq )
4c10: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4c20: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4c30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
4c40: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
4c50: 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ); .    }else{. 
4c60: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
4c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c80: 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p1(v, OP_Sequenc
4c90: 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45  eTest, pSort->iE
4ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
4cb0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4cc0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4ce0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4cf0: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4d00: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4d10: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4d20: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
4d30: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
4d40: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
4d50: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4d60: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4d70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
4d80: 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b   + nData;.    pK
4d90: 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  I = pOp->p4.pKey
4da0: 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Info;.    memset
4db0: 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72  (pKI->aSortOrder
4dc0: 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64  , 0, pKI->nField
4dd0: 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a  ); /* Makes OP_J
4de0: 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62  ump below testab
4df0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
4e00: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4e10: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
4e20: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
4e30: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
4e40: 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a 20 20  >nXField>2 );.  
4e50: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e60: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e70: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e80: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4e90: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69 65 6c       pKI->nXFiel
4ed0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
4ee0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
4ef0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
4f00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f10: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
4f20: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
4f30: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
4f40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4f50: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
4f60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
4f70: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
4f80: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4f90: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
4fa0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
4fb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4fc0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
4fd0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
4fe0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
4ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5000: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
5010: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
5020: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5030: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5050: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5060: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5070: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5080: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5090: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
50a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
50b0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
50c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50d0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
50e0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
50f0: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5100: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5110: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5120: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5130: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
5140: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5150: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
5160: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
5170: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
5180: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
5190: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
51b0: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
51c0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
51d0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
51e0: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
51f0: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5200: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5210: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5220: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
5230: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
5240: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
5250: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
5260: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
5270: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
5280: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
5290: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
52a0: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
52b0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
52c0: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
52d0: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
52e0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
52f0: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5300: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5310: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5320: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
5330: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
5340: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
5350: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
5360: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
5370: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
5380: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
5390: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
53a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
53d0: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
53e0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
53f0: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5400: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5410: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5420: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
5430: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5440: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
5450: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
5460: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
5470: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5480: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
5490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
54a0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
54b0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
54c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
54d0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
54e0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
54f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5500: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5510: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5520: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
5530: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
5540: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5550: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
5560: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5570: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5580: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
5590: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
55a0: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
55b0: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
55c0: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
55d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
55e0: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
55f0: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5600: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5610: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5620: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
5630: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
5640: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5650: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
5660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5670: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5680: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
5690: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
56a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
56b0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
56c0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
56d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
56e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
56f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5700: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5710: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5720: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
5730: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5740: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5750: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5760: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5770: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5780: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5790: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
57a0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
57b0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
57c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
57d0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
57e0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
57f0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5800: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5810: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5830: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
5840: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
5850: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
5860: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
5870: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5880: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5890: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
58a0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
58b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
58c0: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
58d0: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
58e0: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
58f0: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5900: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5910: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5920: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
5930: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
5940: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
5950: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
5960: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
5970: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
5980: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5990: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
59a0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
59b0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
59c0: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
59d0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
59e0: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
59f0: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5a00: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5a10: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5a20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5a30: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
5a40: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5a50: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5a60: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
5a70: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
5a80: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5a90: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5aa0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5ab0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5ac0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5ad0: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5ae0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5af0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5b00: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5b10: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5b20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5b30: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5b40: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5b50: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5b60: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5b70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5b80: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5ba0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5bb0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5bc0: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5bd0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5be0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5bf0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5c00: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c20: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5c30: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5c40: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5c50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5c60: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5c70: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5c80: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5c90: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5cb0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5cc0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5cd0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5ce0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5cf0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5d00: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5d10: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5d20: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
5d30: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
5d40: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
5d50: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
5d60: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72  this row.  If sr
5d70: 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20  cTab is.** zero 
5d80: 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61  or more, then da
5d90: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
5da0: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
5db0: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
5dc0: 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20   .** to get the 
5dd0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
5de0: 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74  s and the collat
5df0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
5e00: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
5e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
5e20: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
5e30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5e50: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5e60: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
5e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5e80: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
5e90: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
5ea0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
5eb0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
5ec0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5ed0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
5ee0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
5ef0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f00: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f10: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f20: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f30: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f40: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f50: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f60: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5f70: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5f80: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5f90: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fa0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fb0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5fc0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5fd0: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
5fe0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
5ff0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6000: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6010: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6020: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6030: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6040: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6060: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
6070: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
6080: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
6090: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60a0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60b0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
60d0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
60e0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
60f0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6100: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6110: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6120: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6130: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6140: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6150: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6160: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
6170: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
6180: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
6190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61b0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61c0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
61d0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
61e0: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
61f0: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6200: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6210: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6220: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6230: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6240: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6250: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6260: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
6270: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
6280: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
6290: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62a0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62b0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62c0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
62d0: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
62e0: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
62f0: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6300: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6310: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6320: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6330: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6340: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6350: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6360: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
6370: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
6380: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
6390: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63a0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63b0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
63d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
63e0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
63f0: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6400: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6410: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
6430: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
6440: 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
6450: 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e  ct ? pDistinct->
6460: 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52  eTnctType : WHER
6470: 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
6480: 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20  .  if( pSort && 
6490: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d  pSort->pOrderBy=
64a0: 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a  =0 ) pSort = 0;.
64b0: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26    if( pSort==0 &
64c0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
64d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  {.    assert( iC
64e0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
64f0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6500: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6510: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
6520: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
6530: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
6540: 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  */.  nResultCol 
6550: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
6560: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
6570: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
6580: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
6590: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
65a0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
65b0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
65c0: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
65d0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
65e0: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
65f0: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
6600: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6610: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
6620: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
6630: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
6640: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
6650: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
6660: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
6670: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
6680: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
6690: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
66a0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
66b0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
66c0: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
66d0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
66e0: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
66f0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
6700: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
6710: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
6720: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
6730: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
6740: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
6750: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
6760: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
6770: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
6780: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
6790: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
67a0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
67b0: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
67c0: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
67d0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
67e0: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
67f0: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
6800: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
6810: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6820: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
6830: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
6840: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
6850: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
6860: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
6870: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
6880: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
6890: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
68a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
68b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
68c0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
68d0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
68e0: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
68f0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
6900: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
6910: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6920: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6930: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
6950: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
6960: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
6970: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
6980: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
6990: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
69a0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
69b0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
69c0: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
69d0: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
69e0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
69f0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6a00: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6a10: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6a20: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6a30: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
6a50: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
6a60: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
6a70: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
6a80: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
6a90: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
6aa0: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6ab0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6ac0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6ad0: 20 70 45 4c 69 73 74 20 74 68 61 74 20 69 73 20   pEList that is 
6ae0: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
6af0: 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20  ression in.     
6b00: 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
6b10: 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d 3e   clause (pSort->
6b20: 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20 74  pOrderBy), set t
6b30: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20  he associated . 
6b40: 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79       ** iOrderBy
6b50: 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65  Col value to one
6b60: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 69   more than the i
6b70: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44 45  ndex of the ORDE
6b80: 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20 65  R BY .      ** e
6b90: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e  xpression within
6ba0: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74 68   the sort-key th
6bb0: 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  at pushOntoSorte
6bc0: 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  r() will generat
6bd0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  e..      ** This
6be0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 45 4c 69   allows the pELi
6bf0: 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f  st field to be o
6c00: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
6c10: 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20  sorted record,. 
6c20: 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73       ** saving s
6c30: 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63  pace and CPU cyc
6c40: 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65  les.  */.      e
6c50: 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  celFlags |= (SQL
6c60: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
6c70: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
6c80: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  );.      for(i=p
6c90: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c  Sort->nOBSat; i<
6ca0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
6cb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6cc0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
6cd0: 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53       if( (j = pS
6ce0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ort->pOrderBy->a
6cf0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
6d00: 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
6d10: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d      pEList->a[j-
6d20: 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  1].u.x.iOrderByC
6d30: 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e  ol = i+1-pSort->
6d40: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20  nOBSat;.        
6d50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6d60: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
6d70: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
6d80: 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65  ==SRT_Set || eDe
6d90: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20  st==SRT_Mem .   
6da0: 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74          || eDest
6db0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6dc0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
6dd0: 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  tput );.    }.  
6de0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 73    nResultCol = s
6df0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
6e00: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70 45  prList(pParse,pE
6e10: 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c 30  List,regResult,0
6e20: 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d  ,ecelFlags);.  }
6e30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
6e40: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
6e50: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
6e60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6e70: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
6e80: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
6e90: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
6ea0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
6eb0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
6ec0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
6ed0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
6ee0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
6ef0: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
6f00: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
6f10: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6f20: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
6f30: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
6f40: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
6f50: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
6f60: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
6f70: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
6f80: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
6f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6fa0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
6fb0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
6fc0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
6fd0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
6fe0: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
6ff0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
7000: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7010: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
7020: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
7030: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
7040: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
7050: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
7060: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
7070: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
7080: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
7090: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
70a0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
70b0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
70c0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
70d0: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
70e0: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
70f0: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
7100: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
7110: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
7120: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
7130: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
7140: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
7150: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
7160: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
7170: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
7180: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
7190: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
71a0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
71b0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
71c0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
71d0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
71e0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
71f0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
7200: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
7210: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
7220: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
7230: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
7240: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
7250: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
7260: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
7270: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7280: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
7290: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
72a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
72b0: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
72c0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
72d0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
72e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
72f0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
7300: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
7310: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
7320: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
7330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7340: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
7350: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
7360: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
7370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
7380: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7390: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
73a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
73b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
73c0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
73d0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
73e0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
73f0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
7400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7420: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7430: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
7440: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
7450: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
7460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7470: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
7480: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
7490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74c0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
74d0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
74e0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
74f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7500: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
7510: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
7520: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
7530: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7540: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7550: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
7560: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
7570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7580: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
7590: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
75a0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
75b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
75c0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
75d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
75e0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
75f0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
7600: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
7610: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
7620: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
7630: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
7640: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
7650: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7670: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
7680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7690: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
76a0: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
76b0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
76c0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
76d0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
76e0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
76f0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
7700: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
7710: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
7720: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
7730: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
7740: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
7750: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
7760: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
7770: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
7780: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
7790: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
77a0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
77b0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
77c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
77d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
77e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
77f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7800: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
7810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7820: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
7830: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7840: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
7850: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7860: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7870: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7880: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
7890: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
78a0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
78b0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
78c0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
78d0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
78e0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
78f0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
7900: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
7910: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
7920: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
7930: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
7940: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7950: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7970: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7980: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
7990: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
79a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
79b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
79c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
79d0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
79e0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
79f0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7a00: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7a10: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7a20: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7a30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7a40: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7a50: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7a60: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7a70: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7a80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7a90: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7aa0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7ab0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ac0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7ad0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7ae0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7af0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7b00: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7b10: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7b20: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7b30: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7b40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7b50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7b60: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7b70: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b80: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7b90: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7ba0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7bb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7bc0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7bd0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7be0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7bf0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7c00: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7c10: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7c20: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7c30: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7c40: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7c50: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7c60: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7c70: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7c80: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7c90: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7ca0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7cc0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7cd0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7ce0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7cf0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7d00: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7d10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7d20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7d30: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7d40: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7d50: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7d60: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7d70: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7d80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7d90: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7db0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7dc0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7dd0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
7de0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
7df0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7e00: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
7e10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7e20: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7e30: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7e40: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7e50: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
7e60: 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c  Reg,regResult,1,
7e70: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7e80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7e90: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
7ea0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7eb0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ed0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7ee0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
7ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f00: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7f10: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7f20: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7f40: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7f50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f60: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f70: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7f90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
7fa0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
7fb0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fd0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7fe0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
7ff0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
8000: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
8010: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
8020: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
8030: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
8040: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
8050: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
8060: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
8070: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
8080: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
8090: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
80a0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
80b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
80c0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
80d0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
80e0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
80f0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
8100: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
8110: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
8120: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
8130: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
8140: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
8150: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
8160: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
8170: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
8180: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
8190: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
81a0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
81b0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
81c0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
81d0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
81e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
81f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
8200: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8210: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
8220: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
8230: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
8240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8250: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
8260: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8270: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
8280: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
8290: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
82a0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
82b0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
82c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
82d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
82e0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
82f0: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
8300: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
8310: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
8320: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8330: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8340: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8350: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8360: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8380: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8390: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83a0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
83b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
83d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
83e0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
83f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8400: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8410: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
8420: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
8430: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
8440: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
8450: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8460: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
8470: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8480: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8490: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
84a0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
84b0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
84c0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
84d0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
84e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
84f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8500: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
8510: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
8520: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
8530: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
8540: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
8550: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
8560: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
8570: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
8580: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
8590: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
85a0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
85b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
85c0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
85d0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
85e0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
85f0: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
8600: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
8610: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
8620: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
8630: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
8640: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
8650: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
8660: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
8670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8680: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
8690: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
86a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
86b0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
86c0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
86d0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
86e0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
86f0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
8700: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
8710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8720: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
8730: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8740: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
8750: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
8760: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
8770: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
8780: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
8790: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
87a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
87b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
87c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
87d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
87e0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
87f0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8800: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
8810: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
8820: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8830: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
8840: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
8850: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
8860: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
8890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
88a0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
88b0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
88c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
88d0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
88e0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
88f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8910: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8920: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
8930: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8950: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
8960: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
8970: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8980: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
8990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
89a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89b0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
89c0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
89d0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
89e0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
89f0: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
8a00: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
8a10: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
8a20: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
8a30: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
8a40: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
8a50: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
8a60: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
8a70: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
8a80: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
8a90: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
8aa0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
8ab0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
8ac0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
8ad0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
8ae0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
8af0: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
8b00: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
8b10: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
8b20: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
8b30: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
8b40: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
8b50: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
8b60: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
8b70: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8b80: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8b90: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8ba0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8bb0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8bc0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8bd0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8be0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8bf0: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8c00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8c10: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
8c20: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8c30: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
8c40: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
8c50: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
8c60: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
8c70: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8c80: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8c90: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8ca0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8cb0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8cc0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8cd0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8cf0: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8d00: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8d10: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
8d20: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
8d30: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
8d40: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
8d50: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
8d60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
8d70: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8d80: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8d90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8db0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8dc0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8dd0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8de0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8df0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8e00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8e10: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
8e20: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8e30: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
8e40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8e50: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8e60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8e80: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8e90: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8ea0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8eb0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8ec0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8ed0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8ee0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8f00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f10: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
8f40: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
8f50: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8f80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8f90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8fa0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8fb0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8fd0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8fe0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
8ff0: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
9000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9010: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9020: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9030: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
9040: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
9050: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
9060: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
9070: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9080: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9090: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
90a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
90b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
90c0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
90d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
90e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
90f0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
9100: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
9110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
9120: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
9130: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
9140: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
9150: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
9160: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
9170: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
9180: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
9190: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
91a0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
91b0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
91c0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
91d0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
91e0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
91f0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
9200: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
9210: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
9220: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
9230: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9240: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
9250: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
9260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9270: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
9280: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
9290: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
92a0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
92b0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
92c0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
92d0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
92e0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
92f0: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
9300: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
9310: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
9320: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
9330: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
9340: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
9350: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9360: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
9370: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
9380: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
9390: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
93a0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
93b0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
93c0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
93d0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
93e0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
93f0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
9400: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9410: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
9420: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
9430: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
9440: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
9450: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
9460: 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  +1);.  KeyInfo *
9470: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
9480: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
9490: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e  eof(KeyInfo) + n
94a0: 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
94b0: 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  ){.    p->aSortO
94c0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  rder = (u8*)&p->
94d0: 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20  aColl[N+X];.    
94e0: 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  p->nField = (u16
94f0: 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65  )N;.    p->nXFie
9500: 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20  ld = (u16)X;.   
9510: 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62   p->enc = ENC(db
9520: 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  );.    p->db = d
9530: 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  b;.    p->nRef =
9540: 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   1;.    memset(&
9550: 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29  p[1], 0, nExtra)
9560: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9570: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
9580: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
9590: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61   p;.}../*.** Dea
95a0: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
95b0: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  o object.*/.void
95c0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
95d0: 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  nref(KeyInfo *p)
95e0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
95f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9600: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9610: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  f--;.    if( p->
9620: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
9630: 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c  3DbFreeNN(p->db,
9640: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
9650: 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69  * Make a new poi
9660: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
9670: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49  o object.*/.KeyI
9680: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
9690: 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a  nfoRef(KeyInfo *
96a0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
96b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
96c0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
96d0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Ref++;.  }.  ret
96e0: 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn p;.}..#ifdef
96f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
9700: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
9710: 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  if a KeyInfo obj
9720: 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67  ect can be chang
9730: 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  e.  The KeyInfo 
9740: 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e  object.** can on
9750: 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66  ly be changed if
9760: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20   this is just a 
9770: 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65  single reference
9780: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a   to the object..
9790: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
97a0: 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
97b0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
97c0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
97d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79  /.int sqlite3Key
97e0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
97f0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74  KeyInfo *p){ ret
9800: 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20  urn p->nRef==1; 
9810: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9820: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
9830: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
9840: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
9850: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
9860: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
9870: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
9880: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
9890: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
98a0: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
98b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
98c0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
98d0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
98e0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
98f0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
9900: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
9910: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
9920: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
9930: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
9940: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
9950: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
9960: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
9970: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
9980: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9990: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
99a0: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
99b0: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
99c0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
99d0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
99e0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
99f0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
9a00: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
9a10: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
9a20: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
9a30: 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
9a40: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
9a50: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
9a60: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
9a70: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
9a80: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
9a90: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
9aa0: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
9ab0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
9ac0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
9ad0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
9ae0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
9af0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9b00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9b10: 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74  t,     /* Form t
9b20: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
9b30: 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72  t from this Expr
9b40: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  List */.  int iS
9b50: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f  tart,          /
9b60: 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69  * Begin with thi
9b70: 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73  s column of pLis
9b80: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
9b90: 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  a           /* A
9ba0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74  dd this many ext
9bb0: 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  ra columns to th
9bc0: 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e end */.){.  in
9bd0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
9be0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
9bf0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9c00: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
9c10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9c20: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ->db;.  int i;..
9c30: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
9c40: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
9c50: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
9c60: 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d  Alloc(db, nExpr-
9c70: 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31  iStart, nExtra+1
9c80: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
9c90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
9ca0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
9cb0: 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29  iteable(pInfo) )
9cc0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61  ;.    for(i=iSta
9cd0: 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  rt, pItem=pList-
9ce0: 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78  >a+iStart; i<nEx
9cf0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
9d00: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
9d10: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
9d20: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
9d30: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
9d40: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
9d50: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
9d60: 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
9d70: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
9d80: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d   pInfo->aColl[i-
9d90: 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b  iStart] = pColl;
9da0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  .      pInfo->aS
9db0: 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72  ortOrder[i-iStar
9dc0: 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  t] = pItem->sort
9dd0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
9de0: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
9df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  .}../*.** Name o
9e00: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9e10: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
9e20: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
9e30: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
9e40: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
9e50: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
9e60: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
9e70: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
9e80: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
9e90: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
9ea0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9eb0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
9ec0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
9ed0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
9ee0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
9ef0: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
9f00: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9f10: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
9f20: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
9f30: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9f40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
9f50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9f60: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
9f70: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
9f80: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9f90: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
9fa0: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
9fb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
9fc0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
9fd0: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
9fe0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
9ff0: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
a000: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
a010: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
a020: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
a030: 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20  .**   "USE TEMP 
a040: 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a  B-TREE FOR xxx".
a050: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20  **.** where xxx 
a060: 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49  is one of "DISTI
a070: 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22  NCT", "ORDER BY"
a080: 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20   or "GROUP BY". 
a090: 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a  Exactly which.**
a0a0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
a0b0: 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67  y the zUsage arg
a0c0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a0d0: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d   void explainTem
a0e0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
a0f0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
a100: 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28   *zUsage){.  if(
a110: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
a120: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
a130: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a140: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
a150: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
a160: 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
a170: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
a180: 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65   FOR %s", zUsage
a190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a1a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a1b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a1c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a1d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a1e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
a1f0: 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69   Assign expressi
a200: 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61  on b to lvalue a
a210: 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f  . A second, no-o
a220: 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  p, version of th
a230: 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70  is macro.** is p
a240: 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c  rovided when SQL
a250: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a260: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
a270: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64  s allows the cod
a280: 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53  e.** in sqlite3S
a290: 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67  elect() to assig
a2a0: 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75  n values to stru
a2b0: 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72  cture member var
a2c0: 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f  iables that.** o
a2d0: 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c  nly exist if SQL
a2e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a2f0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
a300: 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e  without pollutin
a310: 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  g the.** code wi
a320: 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63  th #ifndef direc
a330: 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69  tives..*/.# defi
a340: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
a350: 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62  eger(a, b) a = b
a360: 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  ..#else./* No-op
a370: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
a380: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
a390: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
a3a0: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
a3b0: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
a3c0: 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65  (y,z).# define e
a3d0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
a3e0: 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69  (y,z).#endif..#i
a3f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a400: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
a410: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a420: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
a430: 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55  _SELECT)./*.** U
a440: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
a450: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
a460: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
a470: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
a480: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a490: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a4a0: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a4b0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a4c0: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a4d0: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a4e0: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f   caption is of o
a4f0: 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f  ne of the two fo
a500: 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f  rms:.**.**   "CO
a510: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
a520: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
a530: 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43  b2 (op)".**   "C
a540: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
a550: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
a560: 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42  ub2 USING TEMP B
a570: 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a  -TREE (op)".**.*
a580: 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e  * where iSub1 an
a590: 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20  d iSub2 are the 
a5a0: 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20  integers passed 
a5b0: 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  as the correspon
a5c0: 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ding.** function
a5d0: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64   parameters, and
a5e0: 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20   op is the text 
a5f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
a600: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a  f the parameter.
a610: 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ** of the same n
a620: 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74  ame. The paramet
a630: 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20  er "op" must be 
a640: 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  one of TK_UNION,
a650: 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54   TK_EXCEPT,.** T
a660: 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54  K_INTERSECT or T
a670: 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74  K_ALL. The first
a680: 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66   form is used if
a690: 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d   argument bUseTm
a6a0: 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20  p is .** false, 
a6b0: 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f  or the second fo
a6c0: 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65  rm if it is true
a6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a6e0: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
a6f0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
a700: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
a710: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
a720: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
a730: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a750: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
a760: 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f  K_EXCEPT etc. */
a770: 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20  .  int iSub1,   
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
a7a0: 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  d 1 */.  int iSu
a7b0: 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b2,             
a7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71           /* Subq
a7d0: 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69  uery id 2 */.  i
a7e0: 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20  nt bUseTmp      
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a800: 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70  * True if a temp
a810: 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20   table was used 
a820: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
a830: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20  op==TK_UNION || 
a840: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
a850: 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
a860: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  T || op==TK_ALL 
a870: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
a880: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
a890: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
a8a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
a8b0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
a8c0: 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20  ite3MPrintf(.   
a8d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
a8e0: 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55   "COMPOUND SUBQU
a8f0: 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20  ERIES %d AND %d 
a900: 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20  %s(%s)", iSub1, 
a910: 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62  iSub2,.        b
a920: 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45  UseTmp?"USING TE
a930: 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20  MP B-TREE ":"", 
a940: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29  selectOpName(op)
a950: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
a960: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
a970: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
a980: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
a990: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
a9a0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
a9b0: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
a9c0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
a9d0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
a9e0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
a9f0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
aa00: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c  lainComposite(v,
aa10: 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  w,x,y,z).#endif.
aa20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
aa30: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
aa40: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
aa50: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
aa60: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
aa70: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
aa80: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
aa90: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
aaa0: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
aab0: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
aac0: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
aad0: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
aae0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
aaf0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
ab00: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
ab10: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
ab20: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
ab30: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
ab40: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
ab50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ab60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ab70: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
ab80: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
ab90: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
aba0: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
abb0: 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f  pSort,   /* Info
abc0: 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f  rmation on the O
abd0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
abe0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
abf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ac00: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
ac10: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
ac20: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
ac30: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
ac40: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
ac50: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ac60: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
ac90: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
aca0: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70  nt addrBreak = p
acb0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b  Sort->labelDone;
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
acd0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
ace0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
acf0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
ad00: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ad10: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
ad20: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
ad30: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
ad40: 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  r;.  int addrOnc
ad50: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  e = 0;.  int iTa
ad60: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
ad70: 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d  OrderBy = pSort-
ad80: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
ad90: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
ada0: 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61  eDest;.  int iPa
adb0: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
adc0: 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  arm;.  int regRo
add0: 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  w;.  int regRowi
ade0: 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  d;.  int iCol;. 
adf0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
ae00: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae20: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
ae30: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
ae40: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
ae70: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
ae80: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
ae90: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
aec0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
aed0: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
aee0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
aef0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45  List_item *aOutE
af00: 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  x = p->pEList->a
af10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  ;..  assert( add
af20: 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66  rBreak<0 );.  if
af30: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
af40: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
af50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af60: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
af70: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
af80: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
af90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
afa0: 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b  oto(v, addrBreak
afb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
afc0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
afd0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
afe0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
aff0: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
b000: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
b010: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b020: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b030: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
b040: 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67  T_Mem ){.    reg
b050: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
b060: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
b070: 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44  Sdst;.    nSortD
b080: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
b090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
b0a0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
b0b0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b0c0: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73  ;.    regRow = s
b0d0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
b0e0: 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75  ge(pParse, nColu
b0f0: 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61  mn);.    nSortDa
b100: 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ta = nColumn;.  
b110: 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65  }.  nKey = pOrde
b120: 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  rBy->nExpr - pSo
b130: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66  rt->nOBSat;.  if
b140: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
b150: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
b160: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
b170: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
b180: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
b190: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70      iSortTab = p
b1a0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
b1b0: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61     if( pSort->la
b1c0: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
b1d0: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
b1e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
b1f0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
b200: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b210: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
b220: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
b230: 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74  penPseudo, iSort
b240: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
b250: 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74   nKey+1+nSortDat
b260: 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  a);.    if( addr
b270: 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  Once ) sqlite3Vd
b280: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b290: 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64  drOnce);.    add
b2a0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
b2b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b2c0: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
b2d0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
b2e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b2f0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
b300: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
b310: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
b320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b330: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
b340: 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65  erData, iTab, re
b350: 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54  gSortOut, iSortT
b360: 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  ab);.    bSeq = 
b370: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
b380: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
b390: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b3a0: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
b3b0: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
b3c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b3d0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
b3e0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
b3f0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
b400: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
b410: 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a    bSeq = 1;.  }.
b420: 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d    for(i=0, iCol=
b430: 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c 6e 53 6f  nKey+bSeq; i<nSo
b440: 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20  rtData; i++){.  
b450: 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 20    int iRead;.   
b460: 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75   if( aOutEx[i].u
b470: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29  .x.iOrderByCol )
b480: 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d 20  {.      iRead = 
b490: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b4a0: 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20  rderByCol-1;.   
b4b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
b4c0: 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20  ead = iCol++;.  
b4d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b4e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b4f0: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
b500: 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77 2b  , iRead, regRow+
b510: 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  i);.    VdbeComm
b520: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f  ent((v, "%s", aO
b530: 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20  utEx[i].zName ? 
b540: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
b550: 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61  : aOutEx[i].zSpa
b560: 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n));.  }.  switc
b570: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
b580: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
b590: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
b5a0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
b5b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b5c0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
b5d0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
b5e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b5f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b600: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
b610: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
b620: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b630: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b640: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
b650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
b670: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b680: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
b690: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b6a0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74  ( nColumn==sqlit
b6b0: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74  e3Strlen30(pDest
b6c0: 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a 20  ->zAffSdst) );. 
b6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b6e0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
b6f0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
b700: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77   nColumn, regRow
b710: 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
b720: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
b730: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f  t->zAffSdst, nCo
b740: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
b750: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
b760: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
b770: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
b780: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
b790: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
b7a0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
b7b0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
b7c0: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
b7d0: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
b7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b7f0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
b800: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
b810: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
b820: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
b830: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
b840: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b850: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
b860: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
b870: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b880: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
b890: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
b8a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b8b0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
b8c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b8d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
b8e0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
b8f0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
b900: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
b910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b920: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
b930: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
b940: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
b950: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b960: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
b970: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
b980: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
b990: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b9a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b9b0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b9c0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
b9d0: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
b9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b9f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
ba00: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
ba10: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
ba20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ba30: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
ba40: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
ba50: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
ba60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
ba70: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ba80: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
ba90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
baa0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
bab0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
bac0: 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  wid);.  }.  /* T
bad0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
bae0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
baf0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
bb00: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
bb10: 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f  inue);.  if( pSo
bb20: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
bb30: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
bb40: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
bb50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bb60: 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54  P_SorterNext, iT
bb70: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
bb80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65  overage(v);.  }e
bb90: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
bba0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bbb0: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
bbc0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
bbd0: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
bbe0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
bbf0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
bc00: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
bc10: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
bc20: 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rn);.  sqlite3Vd
bc30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
bc40: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a  , addrBreak);.}.
bc50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
bc60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
bc70: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
bc80: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
bc90: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
bca0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
bcb0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
bcc0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
bcd0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
bce0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ler..**.** Also 
bcf0: 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
bd00: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bd10: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61  returned value a
bd20: 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a  nd return that.*
bd30: 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73  * result in *pEs
bd40: 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  tWidth..**.** Th
bd50: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bd60: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
bd70: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
bd80: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
bd90: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
bda0: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
bdb0: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
bdc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
bdd0: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
bde0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
bdf0: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
be00: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
be10: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
be20: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
be30: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
be40: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
be50: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
be60: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
be70: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
be80: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
be90: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
bea0: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
beb0: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
bec0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
bed0: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
bee0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
bef0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
bf00: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
bf10: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
bf20: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
bf30: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
bf40: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
bf50: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
bf60: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
bf70: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
bf80: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
bf90: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
bfa0: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
bfb0: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
bfc0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
bfd0: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69  s routine has ei
bfe0: 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61  ther 3 or 6 para
bff0: 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67  meters depending
c000: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
c010: 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ot.** the SQLITE
c020: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c030: 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d  ETADATA compile-
c040: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75  time option is u
c050: 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
c060: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c070: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64  UMN_METADATA.# d
c080: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
c090: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
c0a0: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c0b0: 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20  ,C,D,E,F).#else 
c0c0: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
c0d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c0e0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
c0f0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
c100: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
c110: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
c120: 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73  (A,B,F).#endif.s
c130: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c140: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
c150: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
c160: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
c170: 45 78 70 72 2c 0a 23 69 66 64 65 66 20 53 51 4c  Expr,.#ifdef SQL
c180: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c190: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 6f 6e  N_METADATA.  con
c1a0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
c1b0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
c1c0: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
c1d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
c1e0: 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20  rigCol,.#endif. 
c1f0: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
c200: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
c210: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
c220: 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74   j;.  u8 estWidt
c230: 68 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  h = 1;.#ifdef SQ
c240: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c250: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68  MN_METADATA.  ch
c260: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
c270: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
c280: 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  nst *zOrigTab = 
c290: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
c2a0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
c2b0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
c2c0: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61   pExpr!=0 );.  a
c2d0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
c2e0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 77 69  List!=0 );.  swi
c2f0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
c300: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
c310: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
c320: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
c330: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c340: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
c350: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
c360: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
c370: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
c380: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
c390: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
c3a0: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
c3b0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
c3c0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
c3d0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
c3e0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
c3f0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
c400: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
c410: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
c420: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
c430: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c440: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
c450: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
c460: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
c470: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
c480: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c490: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
c4a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
c4b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
c4c0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
c4d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c4e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
c4f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
c500: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
c510: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
c520: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
c530: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
c540: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
c550: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
c560: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
c570: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
c580: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
c590: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
c5a0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
c5b0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
c5c0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
c5d0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
c5e0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
c5f0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
c600: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
c610: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
c620: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
c630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c640: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
c650: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
c660: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
c670: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
c680: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
c690: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
c6a0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
c6b0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
c6c0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
c6d0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
c6e0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
c6f0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
c700: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
c710: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
c720: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
c730: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
c740: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
c750: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
c760: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
c770: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
c780: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
c790: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
c7a0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
c7b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
c7c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c7d0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
c7e0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
c7f0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
c800: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
c810: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
c820: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
c830: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
c840: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
c850: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
c860: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
c870: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
c880: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
c890: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
c8a0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
c8b0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
c8c0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
c8d0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
c8e0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
c8f0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
c900: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
c910: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
c920: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
c930: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
c940: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
c950: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
c960: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
c970: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
c980: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
c990: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
c9a0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
c9b0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
c9c0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
c9d0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
c9e0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
c9f0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ca00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ca10: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ca20: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
ca30: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
ca40: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
ca50: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
ca60: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
ca70: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
ca80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
ca90: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
caa0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
cab0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
cac0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
cad0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
cae0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
caf0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
cb00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
cb10: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
cb20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
cb30: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
cb40: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
cb50: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
cb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
cb70: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
cb80: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
cb90: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
cba0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
cbb0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
cbc0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
cbd0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
cbe0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
cbf0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
cc00: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
cc10: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
cc20: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
cc30: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
cc40: 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
cc50: 54 68 65 20 41 4c 57 41 59 53 28 29 20 69 73 20  The ALWAYS() is 
cc60: 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53  because iCol>=pS
cc70: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cc80: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 20  will have been. 
cc90: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 67           ** caug
cca0: 68 74 20 61 6c 72 65 61 64 79 20 62 79 20 6e 61  ht already by na
ccb0: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20  me resolution.. 
ccc0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ccd0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
cce0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
ccf0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
cd00: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
cd10: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
cd20: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
cd30: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
cd40: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
cd50: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
cd60: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
cd70: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
cd80: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
cd90: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
cda0: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
cdb0: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
cdc0: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20  idth); .        
cdd0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
cde0: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
cdf0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
ce00: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
ce10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
ce20: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
ce30: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
ce40: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
ce50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
ce60: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
ce70: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
ce80: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
ce90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
cea0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
ceb0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cec0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
ced0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
cee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
cef0: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
cf00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cf10: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
cf20: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
cf30: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
cf40: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
cf50: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
cf60: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
cf70: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
cf80: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
cf90: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
cfa0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
cfb0: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
cfc0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
cfd0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
cfe0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
cff0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
d000: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
d010: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
d020: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
d030: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
d040: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
d050: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
d060: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zDbSName;.      
d070: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
d080: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d090: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
d0a0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
d0b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d0c0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
d0d0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
d0e0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
d0f0: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
d100: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
d110: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
d120: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
d130: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
d140: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d160: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
d170: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
d180: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
d190: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
d1a0: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
d1b0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
d1c0: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
d1d0: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
d1e0: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
d1f0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
d200: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
d210: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
d220: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
d230: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
d240: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
d250: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
d260: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
d270: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
d280: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
d290: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
d2a0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
d2b0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
d2c0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
d2d0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
d2e0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
d2f0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
d300: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
d310: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
d320: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
d330: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d340: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
d350: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
d360: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
d370: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
d380: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
d390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d3a0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
d3b0: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
d3c0: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
d3d0: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
d3e0: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
d3f0: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
d400: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
d410: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
d420: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
d430: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
d440: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
d450: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
d460: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
d470: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
d480: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
d490: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
d4a0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
d4b0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
d4c0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
d4d0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
d4e0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
d4f0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
d500: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
d510: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d520: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
d530: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
d540: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
d550: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
d560: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d570: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
d580: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
d590: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d5a0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
d5b0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
d5c0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
d5d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d5e0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
d5f0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
d600: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
d610: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
d620: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
d630: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
d640: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
d650: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d660: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
d670: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
d680: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d690: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
d6a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
d6b0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
d6c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d6d0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
d6e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
d6f0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
d700: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
d710: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
d720: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
d730: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
d740: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
d750: 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  gCol, 0);..    /
d760: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
d770: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
d780: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
d790: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
d7a0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
d7b0: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
d7c0: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
d7d0: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
d7e0: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
d7f0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
d800: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
d810: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
d820: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d830: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
d840: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
d850: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d870: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d880: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
d890: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
d8a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d8b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d8c0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d8d0: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
d8e0: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
d8f0: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
d900: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d910: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
d920: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
d930: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
d940: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d950: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
d960: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
d970: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d980: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
d990: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d9a0: 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d  T_DECLTYPE) */.}
d9b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d9c0: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 63 74  he Table objecct
d9d0: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
d9e0: 74 68 61 74 20 68 61 73 20 63 75 72 73 6f 72 20  that has cursor 
d9f0: 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 4f 72 20 72  iCursor..** Or r
da00: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
da10: 20 73 75 63 68 20 54 61 62 6c 65 20 6f 62 6a 65   such Table obje
da20: 63 74 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ct exists in the
da30: 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 73 74 61   SrcList..*/.sta
da40: 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c 65  tic Table *table
da50: 57 69 74 68 43 75 72 73 6f 72 28 53 72 63 4c 69  WithCursor(SrcLi
da60: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
da70: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 6a  Cursor){.  int j
da80: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
da90: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 29  List->nSrc; j++)
daa0: 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  {.    if( pList-
dab0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 69  >a[j].iCursor==i
dac0: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
dad0: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  pList->a[j].pTab
dae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
daf0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
db00: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
db10: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
db20: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
db30: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
db40: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
db50: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
db60: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
db70: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
db80: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
db90: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
dba0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
dbb0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
dbc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dbd0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
dbe0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
dbf0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
dc00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
dc10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
dc20: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
dc30: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
dc40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
dc50: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
dc60: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
dc70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
dc80: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
dc90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
dca0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
dcb0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
dcc0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
dcd0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
dce0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
dcf0: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
dd00: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
dd10: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
dd20: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
dd30: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
dd40: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
dd50: 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e 6d  amesSet || db->m
dd60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
dd70: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
dd80: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
dd90: 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b  ( pTabList!=0 );
dda0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
ddb0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
ddc0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
ddd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
dde0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
ddf0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
de00: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
de10: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
de20: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
de30: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
de40: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
de50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
de60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
de70: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
de80: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
de90: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
dea0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
deb0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
dec0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
ded0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
dee0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
def0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
df00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
df10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
df20: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
df30: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
df40: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
df50: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
df60: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
df70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
df80: 55 4d 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20  UMN).           
df90: 26 26 20 28 70 54 61 62 20 3d 20 74 61 62 6c 65  && (pTab = table
dfa0: 57 69 74 68 43 75 72 73 6f 72 28 70 54 61 62 4c  WithCursor(pTabL
dfb0: 69 73 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 29  ist, p->iTable))
dfc0: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
dfd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
dfe0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
dff0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e000: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
e010: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
e020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
e030: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
e040: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
e050: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
e060: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
e070: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
e080: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
e090: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
e0a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
e0b0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
e0c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
e0d0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
e0e0: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
e0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e100: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
e110: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
e120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e130: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
e140: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
e150: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e160: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e170: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  f( fullNames ){.
e180: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e190: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
e1a0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e1b0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
e1c0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
e1d0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
e1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e1f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
e200: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
e210: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e220: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e240: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
e250: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
e260: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
e270: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
e280: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e290: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e2a0: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
e2b0: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
e2c0: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
e2d0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
e2e0: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
e2f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e300: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
e310: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
e320: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
e330: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
e340: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
e350: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
e360: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
e370: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
e380: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
e390: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
e3a0: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
e3b0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
e3c0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
e3d0: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
e3e0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
e3f0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e400: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
e410: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
e420: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
e430: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
e440: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
e450: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
e460: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
e470: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
e480: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
e490: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
e4a0: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
e4b0: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
e4c0: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
e4d0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
e4e0: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
e4f0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
e500: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
e510: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
e520: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
e530: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
e540: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
e550: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
e560: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
e570: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e  ITE_NOMEM..*/.in
e580: 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73  t sqlite3Columns
e590: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
e5a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e5b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e5c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e5d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e5e0: 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20  ,       /* Expr 
e5f0: 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20  list from which 
e600: 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e  to derive column
e610: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20   names */.  i16 
e620: 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
e630: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e640: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
e650: 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c  ns here */.  Col
e660: 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20  umn **paCol     
e670: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
e680: 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73  e new column lis
e690: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  t here */.){.  s
e6a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e6b0: 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61  rse->db;   /* Da
e6c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e6d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  n */.  int i, j;
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e700: 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74  ers */.  u32 cnt
e710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e720: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64       /* Index ad
e730: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
e740: 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  name unique */. 
e750: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
e760: 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  pCol;        /* 
e770: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
e780: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
e790: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
e7c0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
e7d0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
e7e0: 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
e7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
e800: 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e  ession for a sin
e810: 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  gle result colum
e820: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  n */.  char *zNa
e830: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
e840: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
e850: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
e860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e870: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
e880: 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
e890: 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e8b0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
e8c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
e8d0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
e8e0: 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
e8f0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
e900: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
e910: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
e920: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
e930: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
e940: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
e950: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
e960: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
e970: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
e980: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
e990: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28   assert( nCol==(
e9a0: 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70  i16)nCol );.  *p
e9b0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
e9c0: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
e9d0: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
e9e0: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21  Col; i<nCol && !
e9f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ea00: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
ea10: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
ea20: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
ea30: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
ea40: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c    */.    p = sql
ea50: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
ea60: 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
ea70: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
ea80: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
ea90: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
eaa0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
eab0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
eac0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
ead0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
eae0: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
eaf0: 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e */.    }else{.
eb00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
eb10: 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68  Expr = p;  /* Th
eb20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
eb30: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
eb40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
eb50: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
eb60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
eb70: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
eb80: 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69  th this expressi
eb90: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  on */.      whil
eba0: 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  e( pColExpr->op=
ebb0: 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
ebc0: 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43     pColExpr = pC
ebd0: 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
ebe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ebf0: 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  pColExpr!=0 );. 
ec00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ec10: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
ec20: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 43 6f 6c  K_COLUMN && pCol
ec30: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b  Expr->pTab!=0 ){
ec40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
ec50: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
ec60: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
ec70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
ec80: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
ec90: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
eca0: 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70    pTab = pColExp
ecb0: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
ecc0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
ecd0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
ece0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
ecf0: 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62  = iCol>=0 ? pTab
ed00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
ed10: 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20  me : "rowid";.  
ed20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
ed30: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
ed40: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
ed50: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
ed60: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
ed70: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
ed80: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ed90: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
eda0: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
edb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
edc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
edd0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
ede0: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
edf0: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
ee00: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
ee10: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
ee20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ee30: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
ee40: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
ee50: 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a   zName);..    /*
ee60: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
ee70: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
ee80: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
ee90: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
eea0: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
eeb0: 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68  an integer to th
eec0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
eed0: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
eee0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74  ..    */.    cnt
eef0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
ef00: 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
ef10: 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a  3HashFind(&ht, z
ef20: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
ef30: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
ef40: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ef50: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  ;.      if( nNam
ef60: 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  e>0 ){.        f
ef70: 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e  or(j=nName-1; j>
ef80: 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  0 && sqlite3Isdi
ef90: 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a  git(zName[j]); j
efa0: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
efb0: 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20  ( zName[j]==':' 
efc0: 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20  ) nName = j;.   
efd0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65     }.      zName
efe0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
eff0: 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c  f(db, "%.*z:%u",
f000: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b   nName, zName, +
f010: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  +cnt);.      if(
f020: 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33   cnt>3 ) sqlite3
f030: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
f040: 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a  of(cnt), &cnt);.
f050: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
f060: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
f070: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
f080: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
f090: 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20  me(0, pCol);.   
f0a0: 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71   if( zName && sq
f0b0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
f0c0: 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c  &ht, zName, pCol
f0d0: 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20  )==pCol ){.     
f0e0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
f0f0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
f100: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
f110: 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64  ar(&ht);.  if( d
f120: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f130: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
f140: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
f150: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f160: 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b, aCol[j].zName
f170: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f180: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
f190: 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c  Col);.    *paCol
f1a0: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c   = 0;.    *pnCol
f1b0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
f1c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f1d0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
f1e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f1f0: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
f200: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
f210: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
f220: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
f230: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
f240: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
f250: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
f260: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
f270: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
f280: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
f290: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
f2a0: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
f2b0: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
f2c0: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
f2d0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
f2e0: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
f2f0: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
f300: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
f310: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
f320: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
f330: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
f340: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
f350: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
f360: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76  e resolved..*/.v
f370: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
f380: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
f390: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
f3a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f3b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
f3c0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62  ontexts */.  Tab
f3d0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
f3e0: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e     /* Add column
f3f0: 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f   type informatio
f400: 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  n to this table 
f410: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
f420: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
f430: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
f440: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
f450: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
f460: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
f470: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
f480: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
f490: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
f4a0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
f4b0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
f4c0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
f4d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
f4e0: 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20  ;.  u64 szAll = 
f4f0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
f500: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
f510: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
f520: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
f530: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
f540: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
f550: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
f560: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
f570: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f580: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
f590: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
f5a0: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
f5b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
f5c0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
f5d0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
f5e0: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
f5f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
f600: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
f610: 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
f620: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
f630: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
f640: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
f650: 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20  int n, m;.    p 
f660: 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[i].pExpr;.  
f670: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
f680: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
f690: 20 30 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a   0, 0, &pCol->sz
f6a0: 45 73 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20  Est);.    szAll 
f6b0: 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  += pCol->szEst;.
f6c0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
f6d0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
f6e0: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
f6f0: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 28 6d   if( zType && (m
f700: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f710: 33 30 28 7a 54 79 70 65 29 29 3e 30 20 29 7b 0a  30(zType))>0 ){.
f720: 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
f730: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e  3Strlen30(pCol->
f740: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43  zName);.      pC
f750: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ol->zName = sqli
f760: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
f770: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
f780: 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20  me, n+m+2);.    
f790: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d    if( pCol->zNam
f7a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e ){.        mem
f7b0: 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  cpy(&pCol->zName
f7c0: 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b  [n+1], zType, m+
f7d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  1);.        pCol
f7e0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
f7f0: 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
f800: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f810: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
f820: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
f830: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
f840: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
f850: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
f860: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
f870: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
f880: 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f  oll && pCol->zCo
f890: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ll==0 ){.      p
f8a0: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
f8b0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
f8c0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
f8d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
f8e0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
f8f0: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
f900: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
f910: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
f920: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
f930: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
f940: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
f950: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
f960: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
f970: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
f980: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
f990: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
f9a0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
f9b0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
f9c0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
f9d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
f9e0: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
f9f0: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
fa00: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
fa10: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
fa20: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
fa30: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
fa40: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
fa50: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
fa60: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
fa70: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
fa80: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
fa90: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
faa0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
fab0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
fac0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
fad0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
fae0: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
faf0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
fb00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
fb10: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
fb20: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
fb30: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
fb40: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
fb50: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
fb60: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
fb70: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
fb80: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
fb90: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
fba0: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
fbb0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
fbc0: 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61  Disable );.  pTa
fbd0: 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
fbe0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
fbf0: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
fc00: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
fc10: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
fc20: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
fc30: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
fc40: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
fc50: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
fc60: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
fc70: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
fc80: 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ol);.  sqlite3Se
fc90: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
fca0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
fcb0: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
fcc0: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
fcd0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
fce0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fcf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
fd00: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
fd10: 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
fd20: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
fd30: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
fd40: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
fd50: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
fd60: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
fd70: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
fd80: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
fd90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
fda0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
fdb0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
fdc0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74  in pParse..*/.st
fdd0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
fde0: 4c 49 4e 45 20 56 64 62 65 20 2a 61 6c 6c 6f 63  LINE Vdbe *alloc
fdf0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
fe00: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
fe10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
fe20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
fe30: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  te(pParse);.  if
fe40: 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( v ) sqlite3Vdb
fe50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
fe60: 69 74 2c 20 30 2c 20 31 29 3b 0a 20 20 69 66 28  it, 0, 1);.  if(
fe70: 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
fe80: 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  el==0.   && Opti
fe90: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
fea0: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
feb0: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
fec0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ).  ){.    pPars
fed0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
fee0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
fef0: 72 6e 20 76 3b 0a 7d 0a 56 64 62 65 20 2a 73 71  rn v;.}.Vdbe *sq
ff00: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
ff10: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
ff20: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ff30: 3e 70 56 64 62 65 3b 0a 20 20 72 65 74 75 72 6e  >pVdbe;.  return
ff40: 20 76 20 3f 20 76 20 3a 20 61 6c 6c 6f 63 56 64   v ? v : allocVd
ff50: 62 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a  be(pParse);.}...
ff60: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
ff70: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
ff80: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
ff90: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
ffa0: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
ffb0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
ffc0: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
ffd0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
ffe0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
fff0: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
10000 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
10010 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
10020 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
10030 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
10040 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
10050 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
10060 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
10070 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
10080 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
10090 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
100a0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
100b0 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
100c0 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
100d0 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
100e0 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
100f0 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
10100 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
10110 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
10120 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
10130 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
10140 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
10150 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
10160 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
10170 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
10180 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
10190 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
101a0 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
101b0 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
101c0 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
101d0 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
101e0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
101f0 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
10200 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
10210 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
10220 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
10230 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
10240 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
10250 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
10260 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
10270 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
10280 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
10290 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
102a0 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
102b0 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
102c0 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
102d0 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
102e0 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
102f0 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
10300 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
10310 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
10320 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
10330 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
10340 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
10350 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
10360 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
10370 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
10380 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
10390 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
103a0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
103b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
103c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
103d0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
103e0 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
103f0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
10400 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
10410 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
10420 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
10430 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
10440 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  t n;.  if( p->iL
10450 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
10460 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
10470 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
10480 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
10490 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
104a0 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
104b0 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
104c0 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
104d0 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
104e0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
104f0 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
10500 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
10510 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
10520 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
10530 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
10540 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
10550 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
10560 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
10570 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
10580 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
10590 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
105a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
105b0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
105c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
105d0 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30      assert( v!=0
105e0 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
105f0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
10600 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20  (p->pLimit, &n) 
10610 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10630 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
10640 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
10650 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
10660 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
10670 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
10680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10690 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
106a0 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
106b0 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
106c0 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
106d0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
106e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
106f0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
10700 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
10710 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
10720 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
10730 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
10740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10750 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10760 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
10770 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
10780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10790 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
107a0 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
107b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
107c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
107d0 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
107e0 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
107f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10800 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
10810 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
10820 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10840 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
10850 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
10860 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
10870 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10880 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
10890 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
108a0 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
108b0 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
108c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
108d0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
108e0 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
108f0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
10900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10910 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
10920 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
10930 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10940 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10950 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
10960 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
10970 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10980 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
10990 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
109a0 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  +1, iOffset);.  
109b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
109c0 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
109d0 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T"));.    }.  }.
109e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
109f0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
10a00 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
10a10 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
10a20 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
10a30 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
10a40 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
10a50 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
10a60 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
10a70 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
10a80 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
10a90 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
10aa0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
10ab0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
10ac0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
10ad0 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
10ae0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
10af0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
10b00 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
10b10 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
10b20 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
10b30 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
10b40 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
10b50 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
10b60 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
10b70 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10b80 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
10b90 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
10ba0 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
10bb0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
10bc0 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
10bd0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
10be0 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
10bf0 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
10c00 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
10c10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
10c20 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f  l>=0 );.  /* iCo
10c30 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  l must be less t
10c40 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  han p->pEList->n
10c50 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65  Expr.  Otherwise
10c60 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a   an error would.
10c70 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74    ** have been t
10c80 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d  hrown during nam
10c90 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64  e resolution and
10ca0 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61   we would not ha
10cb0 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74  ve gotten.  ** t
10cc0 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28  his far */.  if(
10cd0 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41   pRet==0 && ALWA
10ce0 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  YS(iCol<p->pELis
10cf0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
10d00 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
10d10 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10d20 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
10d30 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
10d40 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
10d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
10d60 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
10d70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
10d80 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
10d90 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
10da0 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
10db0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
10dc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
10dd0 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
10de0 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
10df0 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
10e00 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
10e10 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10e20 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
10e30 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
10e40 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
10e50 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
10e60 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
10e70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
10e80 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
10e90 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
10ea0 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
10eb0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
10ec0 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
10ed0 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
10ee0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
10ef0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
10f00 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10f10 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
10f20 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
10f30 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
10f40 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
10f50 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10f60 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10f70 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10f80 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
10f90 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10fa0 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
10fb0 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
10fc0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
10fd0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10fe0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
10ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
11000 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11010 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
11020 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
11030 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
11040 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
11050 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11060 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
11070 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
11080 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
11090 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
110a0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
110b0 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
110c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
110d0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
110e0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
110f0 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
11100 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
11110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11120 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
11130 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
11140 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
11150 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
11160 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11170 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
11180 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
11190 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
111a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
111b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
111c0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
111d0 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
111e0 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
111f0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
11200 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
11210 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
11220 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
11230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
11240 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
11250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11260 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
11270 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
11280 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
11290 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
112a0 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
112b0 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
112c0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
112d0 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
112e0 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
112f0 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
11300 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
11310 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
11340 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
11350 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
11360 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
11380 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
11390 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
113a0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
113b0 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
113c0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
113d0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
113e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
113f0 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
11400 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
11410 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
11420 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  a[].fg.isRecursi
11430 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
11440 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
11450 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
11460 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
11470 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
11480 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
11490 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
114a0 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
114b0 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
114c0 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
114d0 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
114e0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
114f0 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
11500 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
11510 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
11520 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
11530 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
11540 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
11550 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
11560 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
11570 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
11580 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
11590 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
115a0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
115b0 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
115c0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
115d0 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
115e0 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
115f0 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
11600 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
11610 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
11620 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
11630 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
11640 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
11650 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
11660 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
11670 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
11680 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
11690 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
116a0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
116b0 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
116c0 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
116d0 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
116e0 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
116f0 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
11700 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
11710 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
11720 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
11730 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
11740 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
11750 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
11760 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
11770 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
11780 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
11790 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
117a0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
117b0 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
117c0 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
117d0 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
117e0 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
117f0 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
11800 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
11810 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
11820 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
11830 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
11840 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
11850 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
11860 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
11870 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
11880 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
11890 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
118a0 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
118b0 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
118c0 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
118d0 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
118e0 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
118f0 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
11900 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
11910 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
11920 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
11930 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
11940 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
11950 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
11960 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
11970 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
11980 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
11990 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
119a0 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
119b0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
119c0 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
119d0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
119e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
119f0 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
11a00 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
11a10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11a20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11a30 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
11a40 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11a50 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
11a60 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
11a70 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
11a80 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
11a90 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
11aa0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
11ab0 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
11ac0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
11ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
11ae0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
11af0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
11b00 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
11b10 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11b20 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
11b30 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
11b40 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
11b50 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
11b60 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
11b70 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
11b80 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
11b90 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
11ba0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
11bb0 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
11bc0 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
11bd0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
11be0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
11bf0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
11c00 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
11c10 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
11c20 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
11c30 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
11c40 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
11c50 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
11c60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11c70 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
11c80 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
11c90 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
11ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11cb0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
11cc0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
11cd0 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cf0 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
11d00 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
11d10 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
11d20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
11d30 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
11d40 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
11d50 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
11d60 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
11d70 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
11d80 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
11d90 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
11da0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
11db0 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
11dc0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11dd0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11e00 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11e30 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
11e40 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
11e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11e60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11e70 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
11e80 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20  t, *pOffset;    
11e90 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
11ea0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
11eb0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
11ec0 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
11ed0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
11ee0 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
11ef0 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  FFSET */..  /* O
11f00 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74  btain authorizat
11f10 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75  ion to do a recu
11f20 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
11f30 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11f40 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11f50 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20  LITE_RECURSIVE, 
11f60 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
11f70 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  n;..  /* Process
11f80 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
11f90 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69  FFSET clauses, i
11fa0 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a  f they exist */.
11fb0 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
11fc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11fd0 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
11fe0 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
11ff0 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
12000 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
12010 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
12020 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
12030 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
12040 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
12050 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
12060 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
12070 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
12080 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
12090 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
120a0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
120b0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
120c0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
120d0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
120e0 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
120f0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
12100 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
12110 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
12120 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
12130 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
12140 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
12150 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
12160 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
12170 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
12180 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
12190 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
121a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
121b0 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
121c0 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
121d0 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
121e0 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
121f0 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
12200 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
12210 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
12220 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
12230 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
12240 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
12250 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
12260 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
12270 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
12280 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
12290 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
122a0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
122b0 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
122c0 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
122d0 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
122e0 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
122f0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
12300 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
12310 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
12320 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
12330 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
12340 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
12350 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
12360 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
12370 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
12380 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
12390 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
123a0 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
123b0 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
123c0 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
123d0 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
123e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
123f0 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
12400 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
12410 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
12420 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
12430 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
12440 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
12450 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
12460 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
12470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12480 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12490 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
124a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
124b0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
124c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
124d0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
124e0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
124f0 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
12500 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
12510 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
12520 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12530 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12540 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
12550 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
12560 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
12570 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
12580 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
12590 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
125a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125b0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
125c0 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
125d0 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
125e0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
125f0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
12600 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
12610 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12620 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
12630 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
12640 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
12650 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
12660 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
12670 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
12680 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
12690 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72  ->pNext = 0;.  r
126a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
126b0 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
126c0 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
126d0 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
126e0 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
126f0 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
12700 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
12710 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
12720 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
12730 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
12740 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
12750 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
12760 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
12770 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
12780 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
12790 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
127a0 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
127b0 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
127c0 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
127d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
127e0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
127f0 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
12800 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
12810 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
12820 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12840 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
12850 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
12860 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
12870 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
12880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12890 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
128a0 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
128b0 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
128c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
128d0 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
128e0 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
128f0 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
12900 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
12910 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
12920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12930 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64  eLabel(v);.  cod
12940 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66  eOffset(v, regOf
12950 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b  fset, addrCont);
12960 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
12970 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
12980 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e  >pEList, iCurren
12990 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70  t,.      0, 0, p
129a0 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Dest, addrCont, 
129b0 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
129c0 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20  ( regLimit ){.  
129d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
129e0 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
129f0 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74  mpZero, regLimit
12a00 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
12a10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
12a20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12a30 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12a40 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
12a50 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
12a60 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
12a70 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
12a80 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
12a90 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
12aa0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
12ab0 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
12ac0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
12ad0 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
12ae0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
12af0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
12b00 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ate ){.    sqlit
12b10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12b20 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67  e, "recursive ag
12b30 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
12b40 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b  not supported");
12b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
12b60 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
12b70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
12b80 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
12b90 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
12ba0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
12bb0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
12bc0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
12bd0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
12be0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
12bf0 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
12c00 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
12c10 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
12c20 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
12c30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12c40 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
12c50 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
12c60 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
12c70 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
12c80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
12c90 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
12ca0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12cb0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
12cc0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
12cd0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
12ce0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
12cf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12d00 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
12d10 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
12d20 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
12d30 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
12d40 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
12d50 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12d60 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12d70 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12d90 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12da0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12db0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12dc0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12dd0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12de0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12df0 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  /.);../*.** Hand
12e00 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  le the special c
12e10 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ase of a compoun
12e20 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
12e30 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a  iginates from a.
12e40 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ** VALUES clause
12e50 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74  .  By handling t
12e60 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
12e70 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20   case, we avoid 
12e80 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f  deep.** recursio
12e90 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e  n, and thus do n
12ea0 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72  ot need to enfor
12eb0 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ce the SQLITE_LI
12ec0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
12ed0 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55  ECT.** on a VALU
12ee0 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ES clause..**.**
12ef0 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c   Because the Sel
12f00 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69  ect object origi
12f10 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c  nates from a VAL
12f20 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20  UES clause:.**  
12f30 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c   (1) It has no L
12f40 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a  IMIT or OFFSET.*
12f50 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
12f60 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
12f70 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
12f80 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
12f90 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ause.*/.static i
12fa0 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61  nt multiSelectVa
12fb0 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lues(.  Parse *p
12fc0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12fd0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12fe0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13000 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13010 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
13020 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13030 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13040 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13050 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13060 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
13070 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e  *pPrior;.  int n
13080 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
13090 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
130a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
130b0 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a  F_MultiValue );.
130c0 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
130d0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
130e0 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20  SF_Values );.   
130f0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
13100 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70  TK_ALL || (p->op
13110 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70  ==TK_SELECT && p
13120 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a  ->pPrior==0) );.
13130 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13140 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Limit==0 );.    
13150 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
13160 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  et==0 );.    ass
13170 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
13180 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
13190 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e  Expr==p->pNext->
131a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
131b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69  .    if( p->pPri
131c0 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or==0 ) break;. 
131d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50     assert( p->pP
131e0 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29  rior->pNext==p )
131f0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
13200 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b  ior;.    nRow++;
13210 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20  .  }while(1);.  
13220 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
13230 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
13240 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  or;.    p->pPrio
13250 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
13260 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13270 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
13280 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
13290 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28   pPrior;.    if(
132a0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
132b0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
132c0 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70   nRow;.    p = p
132d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  ->pNext;.  }.  r
132e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
132f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13300 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
13310 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
13320 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
13330 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
13340 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
13350 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
13360 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
13370 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
13380 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
13390 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
133a0 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
133b0 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
133c0 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
133d0 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
133e0 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
133f0 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
13400 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
13410 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
13420 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13430 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
13440 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
13450 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
13460 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
13470 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
13480 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
13490 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
134a0 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
134b0 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
134c0 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
134d0 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
134e0 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
134f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
13500 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
13510 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
13520 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
13530 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
13540 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
13550 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
13560 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
13570 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13580 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
13590 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
135a0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
135b0 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
135c0 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
135e0 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
135f0 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
13600 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
13610 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
13620 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
13630 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
13640 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
13650 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13660 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
13670 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
13680 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
13690 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
136a0 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
136b0 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
136c0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
136d0 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
136e0 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
136f0 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
13700 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
13710 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
13720 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
13730 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
13740 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
13750 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
13760 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
13770 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
13780 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13790 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
137a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
137b0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
137c0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
137d0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
137e0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
137f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
13800 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
13810 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
13820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13830 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
13840 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
13850 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
13860 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
13870 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
13880 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
13890 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
138a0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
138b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
138c0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
138d0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
138e0 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
138f0 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
13900 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
13910 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
13920 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
13930 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
13940 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
13950 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
13960 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
13970 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13990 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
139a0 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20  t iSub1 = 0;    
139b0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
139c0 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
139d0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20   */.  int iSub2 
139e0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
139f0 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
13a00 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
13a10 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
13a20 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
13a30 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
13a40 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
13a50 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
13a60 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
13a70 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
13a80 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
13a90 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
13aa0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
13ab0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
13ac0 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
13ad0 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
13ae0 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
13af0 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
13b00 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
13b10 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
13b20 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  ive)==0 || p->op
13b30 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f  ==TK_ALL || p->o
13b40 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
13b50 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
13b60 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
13b70 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
13b80 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
13b90 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
13ba0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13bb0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
13bc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
13bd0 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
13be0 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
13bf0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
13c00 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
13c10 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
13c20 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13c30 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
13c40 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
13c50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13c60 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
13c70 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
13c80 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
13c90 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
13ca0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
13cb0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
13cc0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
13cd0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13ce0 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
13cf0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13d00 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13d10 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
13d20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
13d30 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
13d40 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
13d50 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
13d60 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
13d70 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
13d80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
13d90 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
13da0 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
13db0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
13dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13de0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
13df0 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
13e00 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
13e10 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
13e20 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
13e30 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c  /* Special handl
13e40 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ing for a compou
13e50 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
13e60 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56  riginates as a V
13e70 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20  ALUES clause..  
13e80 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
13e90 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
13ea0 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  alue ){.    rc =
13eb0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
13ec0 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
13ed0 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
13ee0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13f00 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
13f10 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
13f20 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
13f30 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
13f40 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
13f50 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
13f60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
13f70 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
13f80 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73  ->pEList );.  as
13f90 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
13fa0 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e  >nExpr==pPrior->
13fb0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
13fc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13fd0 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
13fe0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13ff0 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
14000 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
14010 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
14020 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
14030 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
14040 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
14050 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
14060 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
14070 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
14080 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
14090 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
140a0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
140b0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
140c0 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
140d0 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
140e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
140f0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
14100 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
14110 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
14120 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
14130 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
14140 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
14150 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
14160 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
14170 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
14180 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
14190 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
141a0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
141b0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
141c0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
141d0 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
141e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
141f0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
14200 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
14210 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14220 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14230 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14240 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14250 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14260 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14270 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
14280 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14290 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
142a0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
142b0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
142c0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
142d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
142e0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
142f0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
14300 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
14310 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
14320 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
14330 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
14340 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
14350 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
14360 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14370 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
14380 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
14390 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
143a0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
143b0 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
143c0 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
143d0 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
143e0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
143f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14410 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
14420 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14440 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
14450 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
14460 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
14470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
14480 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14490 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
144a0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
144b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
144c0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
144d0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
144e0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
144f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14500 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
14510 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14520 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14530 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
14540 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
14550 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
14560 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
14570 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
14580 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
14590 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
145a0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
145b0 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
145c0 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
145d0 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
145e0 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
145f0 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
14600 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
14610 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
14620 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
14630 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
14640 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
14650 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
14660 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
14670 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14680 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
14690 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
146a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
146b0 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
146c0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
146d0 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
146e0 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
146f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
14700 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
14710 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
14720 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
14730 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
14740 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
14750 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
14760 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
14770 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
14780 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
14790 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
147a0 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
147b0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
147c0 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
147d0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
147e0 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
147f0 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
14800 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
14810 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
14820 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
14830 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14840 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
14850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14860 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14870 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
14880 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
14890 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
148a0 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
148b0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
148c0 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
148d0 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
148e0 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
148f0 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
14900 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
14910 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14920 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
14930 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
14940 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
14950 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
14960 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14970 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
14980 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
14990 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
149a0 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
149b0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
149c0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
149d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
149e0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
149f0 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
14a00 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
14a10 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
14a20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
14a30 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
14a40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
14a50 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
14a60 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14a70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14a80 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
14a90 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
14aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ab0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14ac0 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
14ad0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
14ae0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
14af0 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
14b00 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
14b10 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
14b20 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64  dr;.        find
14b30 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
14b40 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14b50 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
14b60 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14b70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
14b80 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14b90 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
14ba0 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
14bb0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
14bc0 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
14bd0 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
14be0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14bf0 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
14c00 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
14c10 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
14c20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14c30 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14c40 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14c50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14c60 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14c70 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
14c80 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
14c90 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
14ca0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
14cb0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
14cc0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14cd0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
14ce0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
14cf0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
14d00 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
14d10 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
14d20 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
14d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
14d40 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
14d50 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
14d60 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
14d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14d80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
14d90 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
14da0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14db0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14dc0 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
14dd0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14de0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
14df0 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
14e00 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
14e10 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14e20 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14e30 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14e40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14e50 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14e60 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
14e70 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
14e80 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
14e90 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
14ea0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
14eb0 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
14ec0 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
14ed0 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
14ee0 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
14ef0 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
14f00 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
14f10 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
14f20 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
14f30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
14f40 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
14f50 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
14f60 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14f70 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14f80 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14f90 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
14fa0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
14fb0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
14fc0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
14fd0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
14fe0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
14ff0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
15000 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
15010 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
15020 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
15030 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
15040 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
15050 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
15060 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
15070 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
15080 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
15090 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->iOffset = 0;..
150a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
150b0 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
150c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
150d0 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
150e0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
150f0 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
15100 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
15110 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
15120 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74  ( unionTab==dest
15130 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74  .iSDParm || dest
15140 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
15150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
15160 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
15170 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
15180 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
15190 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
151a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
151b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
151c0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
151d0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
151e0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
151f0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
15200 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
15210 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
15220 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
15230 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
15240 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
15250 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d  (pParse, pFirst-
15260 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70  >pSrc, pFirst->p
15270 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
15280 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
15290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
152a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
152b0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
152c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
152d0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
152e0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
152f0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
15300 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
15310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15320 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
15330 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
15340 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15350 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
15360 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
15370 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15380 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
15390 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
153a0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
153b0 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
153d0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
153e0 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
153f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15400 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15410 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
15420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15430 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
15440 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
15450 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15470 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15480 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
15490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
154a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
154b0 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
154c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
154d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
154e0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
154f0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
15500 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
15510 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
15520 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
15530 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
15540 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
15550 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
15560 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
15570 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
15580 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
15590 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
155a0 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
155b0 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
155c0 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
155d0 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
155e0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
155f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
15600 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
15610 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
15620 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
15630 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
15640 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
15650 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
15660 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
15670 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
15680 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
15690 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
156a0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
156b0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
156c0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
156d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
156e0 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
156f0 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
15700 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
15710 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
15720 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
15730 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
15740 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
15750 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
15760 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
15770 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
15780 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15790 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
157a0 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
157b0 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
157c0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
157d0 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
157e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
157f0 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
15800 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
15810 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
15820 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
15830 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
15840 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
15850 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15860 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15870 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
15880 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
15890 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
158a0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
158b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
158c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
158d0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
158e0 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
158f0 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
15900 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
15910 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15930 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
15940 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
15950 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
15960 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
15970 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
15980 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
15990 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
159a0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
159b0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
159c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
159d0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
159e0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
159f0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
15a00 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
15a10 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
15a20 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
15a30 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
15a40 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
15a50 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
15a60 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
15a70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15a80 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
15a90 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
15aa0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
15ab0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
15ac0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
15ad0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
15ae0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
15af0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
15b00 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
15b10 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
15b20 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
15b30 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
15b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15b50 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
15b60 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
15b70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
15b80 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
15b90 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
15ba0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
15bb0 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
15bc0 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
15bd0 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
15be0 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
15bf0 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
15c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15c10 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
15c20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
15c30 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
15c40 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
15c50 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
15c60 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
15c70 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
15c80 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
15c90 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
15ca0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
15cb0 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70  Parse, pFirst->p
15cc0 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  Src, pFirst->pEL
15cd0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
15ce0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
15cf0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15d00 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
15d10 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
15d20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15d30 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
15d40 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
15d50 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
15d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d70 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
15d80 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
15d90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15da0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
15db0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15dc0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
15dd0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15de0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15df0 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
15e00 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15e10 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
15e20 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
15e30 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
15e40 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
15e50 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15e60 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15e70 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
15e80 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15e90 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
15ea0 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a  ->pEList, tab1,.
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
15ed0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
15ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15ef0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15f00 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
15f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f20 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15f30 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56  tab1, iStart); V
15f40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15f60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15f70 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f90 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15fa0 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
15fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15fc0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
15fd0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
15fe0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
15ff0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
16000 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
16010 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
16020 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a  p->op!=TK_ALL);.
16030 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
16040 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16050 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
16060 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
16070 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
16080 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
16090 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
160a0 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
160b0 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
160c0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
160d0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
160e0 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
160f0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
16100 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
16110 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
16120 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16130 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
16140 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
16150 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
16160 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
16170 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
16180 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
16190 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
161a0 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
161b0 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
161c0 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
161d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
161e0 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
161f0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
16200 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16220 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
16230 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
16240 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
16250 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
16260 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
16270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
16280 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
16290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
162a0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
162b0 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
162c0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
162d0 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
162e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
162f0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
16300 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
16310 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
16320 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16340 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
16350 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
16360 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
16370 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  p->pNext==0 );. 
16380 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
16390 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
163a0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
163b0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
163c0 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  b, nCol, 1);.   
163d0 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
163e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
163f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
16400 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
16410 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
16420 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
16430 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
16440 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
16450 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
16460 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
16470 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
16480 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
16490 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
164a0 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
164b0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
164c0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
164d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
164e0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
164f0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
16500 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
16510 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
16520 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
16530 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
16540 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
16550 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
16560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
16570 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
16580 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
16590 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
165a0 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
165b0 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
165c0 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
165d0 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
165e0 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
165f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
16600 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
16610 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
16620 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16650 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
16660 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
16670 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16680 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
16690 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
166a0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
166b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
166d0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
166e0 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
166f0 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
16700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16710 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
16720 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
16730 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
16740 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
16750 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
16760 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
16770 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
16780 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
16790 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
167a0 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
167b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
167c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
167d0 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
167e0 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  .** Error messag
167f0 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f  e for when two o
16800 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  r more terms of 
16810 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
16820 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  t have different
16830 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20  .** size result 
16840 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sets..*/.void sq
16850 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
16860 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61  NumTermsError(Pa
16870 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
16880 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
16890 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
168a0 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71  Values ){.    sq
168b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
168c0 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
168d0 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
168e0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
168f0 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  erms");.  }else{
16900 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16910 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
16920 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
16930 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
16940 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
16950 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
16960 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
16970 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
16980 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
16990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
169a0 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
169b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
169c0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
169d0 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
169e0 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
169f0 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
16a00 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
16a10 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
16a20 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
16a30 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
16a40 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
16a50 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
16a60 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
16a70 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
16a80 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
16a90 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
16aa0 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
16ab0 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
16ac0 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
16ad0 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
16ae0 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
16af0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
16b00 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
16b10 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
16b20 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
16b30 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
16b40 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
16b50 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
16b60 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
16b70 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
16b80 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
16b90 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
16ba0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
16bb0 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
16bc0 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
16bd0 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
16be0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
16bf0 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
16c00 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
16c10 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
16c20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
16c30 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
16c40 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
16c50 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
16c60 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
16c70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
16c90 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
16ca0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
16cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16cc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16cd0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
16ce0 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
16cf0 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
16d00 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
16d10 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
16d20 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
16d30 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
16d40 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
16d50 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
16d60 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
16d70 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
16d80 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
16d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
16da0 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
16db0 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
16dc0 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
16dd0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16de0 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
16df0 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
16e00 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
16e10 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
16e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
16e30 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
16e40 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
16e50 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
16e60 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
16e70 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
16e80 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
16e90 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
16ea0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
16eb0 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
16ec0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16ed0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
16ee0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
16ef0 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
16f00 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
16f10 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
16f20 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
16f30 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
16f40 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
16f50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16f60 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
16f70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16f80 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  v);.    addr2 = 
16f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fa0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
16fb0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
16fc0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
16fd0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
17000 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
17010 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
17020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17030 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
17040 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43  ump, addr2+2, iC
17050 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32  ontinue, addr2+2
17060 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17070 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
17080 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17090 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
170a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
170b0 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
170c0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
170d0 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
170e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
17100 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
17110 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
17120 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
17130 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
17140 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
17150 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
17160 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
17170 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
17180 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
17190 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
171a0 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
171b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  ;..  assert( pDe
171c0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45  st->eDest!=SRT_E
171d0 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72  xists );.  asser
171e0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
171f0 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
17200 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
17210 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
17220 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
17230 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
17240 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
17250 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17260 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
17270 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
17280 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17290 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
172a0 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
172b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
172c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
172e0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
172f0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17300 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
17310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17320 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
17330 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
17340 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
17350 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17360 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
17370 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
17380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17390 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
173a0 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
173b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
173c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
173d0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
173e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
173f0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
17400 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17410 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
17420 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17430 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
17440 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
17450 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
17460 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
17470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17480 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
17490 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
174a0 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
174b0 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20  nSdst>1 );.     
174c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
174d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
174e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
174f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
17500 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
17510 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17520 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 31  t, .          r1
17530 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
17540 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17560 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
17570 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
17580 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17590 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
175a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
175b0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
175c0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
175d0 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
17600 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
17610 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17620 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
17630 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17640 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17650 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
17660 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
17670 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
17680 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
17690 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
176a0 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
176b0 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
176c0 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
176d0 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
176e0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
176f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17700 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
17710 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
17720 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =1 || pParse->nE
17730 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73  rr>0 );  testcas
17740 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31  e( pIn->nSdst!=1
17750 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17760 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
17770 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
17780 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
17790 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
177a0 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
177b0 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
177c0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
177d0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
177e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
177f0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
17800 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
17810 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
17820 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
17830 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
17840 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
17850 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
17860 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
17870 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
17880 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
17890 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
178a0 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
178b0 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
178c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
178d0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
178e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
178f0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
17900 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
17910 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
17920 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
17930 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
17940 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
17950 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
17960 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49  pDest->iSdst, pI
17970 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17990 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
179a0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
179b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
179c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
179d0 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
179e0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
179f0 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
17a00 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
17a10 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
17a20 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
17a30 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
17a40 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
17a50 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
17a60 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
17a70 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
17a80 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
17a90 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
17aa0 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
17ab0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
17ac0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
17ad0 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
17ae0 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
17af0 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
17b00 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
17b10 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
17b20 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
17b30 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
17b40 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
17b50 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
17b60 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
17b70 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
17b80 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
17b90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17ba0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
17bb0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
17bc0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
17bd0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
17be0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
17bf0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
17c00 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17c10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
17c30 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
17c40 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
17c50 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
17c60 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
17c70 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
17c80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17c90 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
17ca0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
17cb0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17cc0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
17cd0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
17ce0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
17cf0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
17d00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17d10 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
17d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d30 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
17d40 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
17d50 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
17d60 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
17d70 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
17d80 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
17d90 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
17da0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
17db0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
17dc0 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
17dd0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
17de0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
17df0 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
17e00 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
17e10 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
17e20 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
17e30 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
17e40 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
17e50 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
17e60 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
17e70 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
17e80 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
17e90 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
17ea0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
17eb0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
17ec0 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
17ed0 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
17ee0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
17ef0 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
17f00 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
17f10 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
17f20 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
17f30 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
17f40 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
17f50 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
17f60 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
17f70 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
17f80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
17f90 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
17fa0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
17fb0 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
17fc0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
17fe0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
17ff0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
18000 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
18010 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
18020 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
18030 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
18050 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
18060 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
18070 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
18080 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
18090 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
180a0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
180b0 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
180c0 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
180d0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
180e0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
180f0 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
18100 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
18110 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
18120 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
18130 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
18140 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
18150 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
18160 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
18170 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
18180 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
18190 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
181a0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
181b0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
181c0 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
181d0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
181e0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
181f0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
18200 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
18210 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
18220 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
18230 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
18240 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
18250 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
18260 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
18270 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
18280 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
18290 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
182a0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
182b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
182c0 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
182d0 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
182e0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
182f0 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
18300 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
18310 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
18320 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
18330 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
18340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
18350 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
18360 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
18370 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
18380 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
18390 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
183a0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
183b0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
183c0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
183d0 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
183e0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
183f0 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
18400 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
18410 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
18420 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
18430 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
18440 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
18450 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
18460 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
18470 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
18480 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
18490 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
184a0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
184b0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
184c0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
184d0 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
184e0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
184f0 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
18500 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
18510 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
18520 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
18530 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
18540 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
18550 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
18560 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
18570 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
18580 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
18590 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
185a0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
185b0 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
185c0 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
185d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
185e0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
185f0 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
18600 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
18610 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
18620 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
18630 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
18640 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
18650 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
18660 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
18670 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
18680 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
18690 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
186a0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
186b0 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
186c0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
186d0 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
186e0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
186f0 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
18700 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
18710 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
18720 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
18730 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
18740 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
18750 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
18760 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
18770 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
18780 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
18790 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
187a0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
187b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
187c0 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
187d0 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
187e0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
187f0 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
18800 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
18810 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
18820 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
18830 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
18840 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
18850 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
18860 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
18870 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
18880 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
18890 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
188a0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
188b0 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
188c0 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
188d0 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
188e0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
188f0 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
18900 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
18910 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
18920 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
18930 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
18940 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
18950 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
18960 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
18970 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
18980 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
18990 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
189a0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
189b0 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
189c0 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
189d0 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
189e0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
189f0 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
18a00 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
18a10 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
18a20 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
18a30 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
18a40 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
18a50 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
18a60 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
18a70 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
18a80 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
18a90 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
18aa0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
18ab0 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
18ac0 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
18ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
18ae0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
18af0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
18b00 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
18b10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18b20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
18b30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
18b40 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
18b50 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
18b60 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
18b70 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
18b80 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
18b90 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
18ba0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
18bb0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
18bc0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
18bd0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18be0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
18bf0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
18c00 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
18c10 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
18c20 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
18c30 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
18c40 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
18c50 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
18c60 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
18c70 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
18c80 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
18c90 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
18ca0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
18cb0 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
18cc0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
18cd0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
18ce0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
18cf0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
18d00 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
18d10 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
18d20 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
18d30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18d40 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
18d50 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
18d60 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18d70 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
18d80 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18d90 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
18da0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18db0 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
18dc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18dd0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
18de0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
18df0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
18e00 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
18e10 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
18e20 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
18e30 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
18e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
18e50 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18e60 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
18e70 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18e80 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
18e90 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18ea0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
18eb0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18ec0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
18ed0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
18ee0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
18ef0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18f00 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
18f10 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18f20 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
18f30 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
18f40 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18f50 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
18f60 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
18f70 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
18f80 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
18f90 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
18fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18fb0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
18fc0 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
18fd0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18fe0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
18ff0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19000 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
19010 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19020 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
19030 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19040 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
19050 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
19060 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
19070 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
19080 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
19090 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
190a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
190b0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
190c0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
190d0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
190e0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
190f0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
19100 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
19110 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
19120 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
19130 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
19140 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
19150 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
19160 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
19170 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
19180 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
19190 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
191a0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
191b0 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
191c0 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
191d0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
191e0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
191f0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
19200 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
19210 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
19220 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
19230 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
19240 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
19250 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
19260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
19270 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
19280 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
19290 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
192a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
192b0 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
192c0 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
192d0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
192e0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
192f0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
19300 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
19310 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
19320 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
19330 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
19340 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
19350 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
19360 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
19370 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
19380 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
19390 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
193a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
193b0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
193c0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
193d0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
193e0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
193f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19400 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
19410 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
19420 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
19430 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
19440 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
19450 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
19460 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
19470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19480 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
19490 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
194a0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
194b0 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
194c0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
194d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
194e0 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
194f0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
19500 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
19510 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
19520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
19530 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
19540 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
19550 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
19560 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
19570 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
19580 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19590 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
195a0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
195b0 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
195c0 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
195d0 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
195e0 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
195f0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19600 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
19610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19620 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
19630 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
19640 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
19650 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
19660 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
19670 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
19680 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
19690 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
196a0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
196b0 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
196c0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
196d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
196e0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
196f0 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
19700 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
19710 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
19720 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
19730 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19740 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
19750 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
19760 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
19770 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
19780 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19790 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
197a0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
197b0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
197c0 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
197d0 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
197e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
197f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
19800 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19810 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
19820 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
19830 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
19840 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
19850 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
19860 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
19870 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
19880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19890 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
198a0 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
198b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
198c0 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
198d0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
198e0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
198f0 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
19900 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
19910 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
19920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19930 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
19940 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
19950 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
19960 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
19970 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
19980 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
19990 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
199a0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
199b0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
199c0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
199d0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
199e0 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
199f0 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65  rBy++].u.x.iOrde
19a00 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  rByCol = (u16)i;
19a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19a20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
19a30 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
19a40 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
19a50 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
19a60 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
19a70 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
19a80 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
19a90 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
19aa0 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
19ab0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
19ac0 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
19ad0 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
19ae0 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
19af0 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
19b00 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
19b10 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
19b20 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
19b30 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
19b40 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
19b50 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
19b60 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
19b70 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
19b80 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
19b90 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19ba0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
19bb0 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79 20  (int)*(nOrderBy 
19bc0 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50 65  + 1));.  if( aPe
19bd0 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
19be0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19bf0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 50  m *pItem;.    aP
19c00 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64  ermute[0] = nOrd
19c10 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d  erBy;.    for(i=
19c20 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  1, pItem=pOrderB
19c30 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42  y->a; i<=nOrderB
19c40 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
19c50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19c60 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19c70 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
19c80 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
19c90 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19ca0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
19cb0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
19cc0 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
19cd0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19ce0 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
19cf0 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74  pKeyMerge = mult
19d00 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
19d10 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
19d20 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
19d30 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
19d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
19d50 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
19d60 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
19d70 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
19d80 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
19d90 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
19da0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
19db0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
19dc0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
19dd0 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
19de0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
19df0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
19e00 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
19e10 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
19e20 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
19e30 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
19e40 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
19e50 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
19e60 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
19e70 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
19e80 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
19e90 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
19ea0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
19eb0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
19ec0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
19ed0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
19ee0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
19ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
19f00 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
19f10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19f20 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
19f30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
19f40 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
19f50 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
19f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19f80 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
19f90 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
19fa0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
19fb0 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
19fc0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
19fd0 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
19fe0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
19ff0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
1a000 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
1a010 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
1a020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a030 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
1a040 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
1a050 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1a060 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
1a070 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
1a080 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
1a090 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
1a0a0 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
1a0b0 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
1a0c0 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
1a0d0 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
1a0e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1a0f0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1a100 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
1a110 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1a120 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
1a130 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1a140 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
1a150 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
1a160 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1a170 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
1a180 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
1a190 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
1a1a0 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
1a1b0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1a1c0 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
1a1d0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
1a1e0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
1a1f0 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
1a200 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1a210 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
1a220 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
1a230 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a240 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
1a250 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a270 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1a280 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
1a290 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
1a2a0 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1a2d0 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
1a2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a2f0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
1a300 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
1a310 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1a320 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
1a330 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
1a340 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1a350 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
1a360 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
1a370 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
1a380 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
1a390 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
1a3a0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
1a3b0 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
1a3c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
1a3d0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
1a3e0 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
1a3f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a400 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
1a410 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
1a420 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1a430 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
1a440 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1a450 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
1a460 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
1a470 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
1a480 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
1a490 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a4a0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1a4b0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1a4c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
1a4d0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
1a4e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
1a4f0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
1a500 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1a510 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
1a520 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1a530 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1a540 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1a550 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1a560 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1a570 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
1a580 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
1a590 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
1a5a0 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
1a5b0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
1a5c0 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c  egLimitA;.  expl
1a5d0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1a5e0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
1a5f0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1a600 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1a610 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
1a620 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
1a630 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1a640 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
1a650 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1a660 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
1a670 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1a680 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1a690 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1a6a0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
1a6b0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
1a6c0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
1a6d0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1a6e0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1a6f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1a700 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1a710 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a720 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1a730 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
1a740 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
1a750 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1a760 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
1a770 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
1a780 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
1a790 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
1a7a0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
1a7b0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
1a7c0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1a7d0 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
1a7e0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
1a7f0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
1a800 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
1a810 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1a820 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
1a830 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
1a840 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
1a850 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
1a860 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
1a870 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1a880 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
1a890 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1a8a0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1a8b0 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1a8c0 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
1a8d0 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1a8e0 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1a8f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1a900 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
1a910 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a920 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
1a930 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
1a940 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
1a950 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
1a960 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
1a970 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
1a980 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
1a990 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
1a9a0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
1a9b0 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
1a9c0 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
1a9d0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1a9e0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
1a9f0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1aa00 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
1aa10 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
1aa20 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
1aa30 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
1aa40 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
1aa50 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1aa60 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1aa70 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1aa80 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
1aa90 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
1aaa0 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
1aab0 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1aac0 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aae0 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
1aaf0 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1ab10 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1ab20 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
1ab30 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
1ab40 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
1ab50 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1ab60 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1ab70 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1ab80 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
1ab90 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1aba0 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1abb0 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
1abc0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1abd0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
1abe0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1abf0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1ac00 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41  A_noB = addrEofA
1ac10 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d   = labelEnd;.  }
1ac20 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1ac30 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1ac40 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
1ac50 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1ac60 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
1ac70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1ac80 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1ac90 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72  rOutB);.    addr
1aca0 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74  EofA_noB = sqlit
1acb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1acc0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1acd0 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  rB, labelEnd);. 
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ad10 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1ad20 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
1ad30 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
1ad40 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
1ad50 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
1ad60 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
1ad70 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
1ad80 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1ad90 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1ada0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1adb0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1adc0 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
1add0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1ade0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1adf0 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
1ae00 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
1ae10 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1ae20 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
1ae30 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
1ae40 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
1ae50 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
1ae60 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1ae70 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1ae80 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
1ae90 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1aea0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
1aeb0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1aec0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
1aed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1aee0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1aef0 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1af00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1af10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1af20 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62  d, regAddrA, lab
1af30 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  elEnd); VdbeCove
1af40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1af50 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1af60 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
1af70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1af80 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1af90 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
1afa0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1afb0 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
1afc0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1afd0 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
1afe0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1aff0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b000 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1b010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b020 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b030 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1b040 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1b050 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b060 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b070 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
1b080 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1b090 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1b0a0 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
1b0b0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1b0c0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1b0d0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
1b0e0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1b0f0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1b100 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1b110 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
1b120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
1b130 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b140 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
1b150 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1b160 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
1b170 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b180 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b190 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1b1a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b1b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b1c0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1b1d0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1b1e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1b1f0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1b200 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1b210 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1b220 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1b230 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1b240 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1b250 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1b260 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1b270 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1b280 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b290 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b2a0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1b2b0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1b2c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b2d0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b2e0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1b2f0 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1b300 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b310 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b320 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
1b330 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
1b340 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
1b350 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
1b360 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1b370 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1b380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b390 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b3a0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1b3b0 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43  EofA_noB); VdbeC
1b3c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b3d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b3e0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b3f0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1b400 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b410 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
1b420 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
1b430 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
1b440 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1b450 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
1b460 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
1b470 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
1b480 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
1b490 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
1b4a0 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
1b4b0 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
1b4c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1b4d0 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
1b4e0 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
1b4f0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
1b520 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
1b530 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b540 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
1b550 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
1b560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b570 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
1b580 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
1b590 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65   addrAgtB); Vdbe
1b5a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1b5b0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
1b5c0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
1b5d0 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
1b5e0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1b5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b600 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b610 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
1b620 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1b630 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
1b640 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1b650 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
1b660 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
1b670 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
1b680 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
1b690 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
1b6a0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
1b6b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
1b6c0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
1b6d0 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e  pParse, pFirst->
1b6e0 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45  pSrc, pFirst->pE
1b6f0 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
1b700 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1b710 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1b720 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1b730 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1b740 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1b750 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1b760 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1b770 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b780 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1b790 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1b7a0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1b7b0 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1b7c0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1b7d0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1b7e0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1b7f0 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1b800 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1b810 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1b820 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1b830 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1b840 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1b850 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1b860 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1b870 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1b880 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1b890 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1b8a0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1b8b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1b8c0 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  )../* An instanc
1b8d0 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f  e of the SubstCo
1b8e0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73  ntext object des
1b8f0 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69  cribes an substi
1b900 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74  tution edit.** t
1b910 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  o be performed o
1b920 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a  n a parse tree..
1b930 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65  **.** All refere
1b940 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
1b950 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  in table iTable 
1b960 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  are to be replac
1b970 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64  ed by correspond
1b980 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
1b990 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f  ns in pEList..*/
1b9a0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1b9b0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20  SubstContext {. 
1b9c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1b9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b9e0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1b9f0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  t */.  int iTabl
1ba00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ba10 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65   /* Replace refe
1ba20 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
1ba30 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  able */.  int iN
1ba40 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  ewTable;        
1ba50 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65      /* New table
1ba60 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
1ba70 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20   isLeftJoin;    
1ba80 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b         /* Add TK
1ba90 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63  _IF_NULL_ROW opc
1baa0 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70  odes on each rep
1bab0 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78  lacement */.  Ex
1bac0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
1bad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1bae0 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f  cement expressio
1baf0 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e  ns */.} SubstCon
1bb00 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72  text;../* Forwar
1bb10 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
1bb20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
1bb30 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73  bstExprList(Subs
1bb40 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c  tContext*, ExprL
1bb50 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  ist*);.static vo
1bb60 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53  id substSelect(S
1bb70 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65  ubstContext*, Se
1bb80 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a  lect*, int);../*
1bb90 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
1bba0 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1bbb0 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
1bbc0 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
1bbd0 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
1bbe0 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
1bbf0 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
1bc00 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
1bc10 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
1bc20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
1bc30 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
1bc40 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
1bc50 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
1bc60 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
1bc70 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
1bc80 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
1bc90 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
1bca0 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
1bcb0 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
1bcc0 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
1bcd0 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
1bce0 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
1bcf0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
1bd00 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
1bd10 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
1bd20 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
1bd30 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
1bd40 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
1bd50 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
1bd60 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  s the necessary 
1bd70 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70  .** changes to p
1bd80 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20  Expr so that it 
1bd90 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
1bda0 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  to the source ta
1bdb0 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ble.** of the su
1bdc0 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68  bquery rather th
1bdd0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1bde0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
1bdf0 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75  .static Expr *su
1be00 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74  bstExpr(.  Subst
1be10 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1be20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
1be30 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75   of the substitu
1be40 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tion */.  Expr *
1be50 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
1be60 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
1be70 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
1be80 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ccurs */.){.  if
1be90 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
1bea0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70  urn 0;.  if( Exp
1beb0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1bec0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1bed0 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68   && pExpr->iRigh
1bee0 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62  tJoinTable==pSub
1bef0 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20  st->iTable ){.  
1bf00 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a    pExpr->iRightJ
1bf10 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75 62 73  oinTable = pSubs
1bf20 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1bf30 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
1bf40 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
1bf50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1bf60 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1bf70 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
1bf80 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20  iColumn<0 ){.   
1bf90 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
1bfa0 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73  K_NULL;.    }els
1bfb0 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
1bfc0 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20  New;.      Expr 
1bfd0 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74 2d  *pCopy = pSubst-
1bfe0 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72  >pEList->a[pExpr
1bff0 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72  ->iColumn].pExpr
1c000 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69 66 4e  ;.      Expr ifN
1c010 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 61 73  ullRow;.      as
1c020 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e 70 45  sert( pSubst->pE
1c030 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72  List!=0 && pExpr
1c040 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74  ->iColumn<pSubst
1c050 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1c060 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c070 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
1c080 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
1c090 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t==0 );.      if
1c0a0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 56  ( sqlite3ExprIsV
1c0b0 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a  ector(pCopy) ){.
1c0c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c0d0 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28 70 53  ectorErrorMsg(pS
1c0e0 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20 70 43  ubst->pParse, pC
1c0f0 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  opy);.      }els
1c100 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1c110 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73 74 2d  e3 *db = pSubst-
1c120 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20  >pParse->db;.   
1c130 20 20 20 20 20 69 66 28 20 70 53 75 62 73 74 2d       if( pSubst-
1c140 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70  >isLeftJoin && p
1c150 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Copy->op!=TK_COL
1c160 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UMN ){.         
1c170 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52   memset(&ifNullR
1c180 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 66  ow, 0, sizeof(if
1c190 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20  NullRow));.     
1c1a0 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f       ifNullRow.o
1c1b0 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52  p = TK_IF_NULL_R
1c1c0 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  OW;.          if
1c1d0 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20  NullRow.pLeft = 
1c1e0 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  pCopy;.         
1c1f0 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c   ifNullRow.iTabl
1c200 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77  e = pSubst->iNew
1c210 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1c220 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c   pCopy = &ifNull
1c230 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Row;.        }. 
1c240 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
1c250 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
1c260 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20   pCopy, 0);.    
1c270 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1c280 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
1c290 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1c2a0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1c2b0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1c2c0 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  = pExpr->iRightJ
1c2d0 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  oinTable;.      
1c2e0 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
1c2f0 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a  |= EP_FromJoin;.
1c300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c310 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1c320 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
1c330 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1c340 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNew;.      }.  
1c350 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c360 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
1c370 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 26  TK_IF_NULL_ROW &
1c380 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
1c390 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20  =pSubst->iTable 
1c3a0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1c3b0 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d  iTable = pSubst-
1c3c0 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >iNewTable;.    
1c3d0 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65  }.    pExpr->pLe
1c3e0 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ft = substExpr(p
1c3f0 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c  Subst, pExpr->pL
1c400 65 66 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  eft);.    pExpr-
1c410 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45  >pRight = substE
1c420 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1c430 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
1c440 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c450 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
1c460 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
1c470 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 53    substSelect(pS
1c480 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1c490 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20  Select, 1);.    
1c4a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62  }else{.      sub
1c4b0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1c4c0 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t, pExpr->x.pLis
1c4d0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1c4e0 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
1c4f0 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
1c500 74 45 78 70 72 4c 69 73 74 28 0a 20 20 53 75 62  tExprList(.  Sub
1c510 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1c520 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1c530 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1c540 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ution */.  ExprL
1c550 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20  ist *pList      
1c560 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e   /* List to scan
1c570 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f   and in which to
1c580 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65   make substitute
1c590 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
1c5a0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1c5b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1c5c0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
1c5d0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
1c5e0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1c5f0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1c600 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  bst, pList->a[i]
1c610 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 73  .pExpr);.  }.}.s
1c620 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1c630 53 65 6c 65 63 74 28 0a 20 20 53 75 62 73 74 43  Select(.  SubstC
1c640 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1c650 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1c660 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69  f the substituti
1c670 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1c680 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1c690 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c6a0 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
1c6b0 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
1c6c0 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f   */.  int doPrio
1c6d0 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  r           /* D
1c6e0 6f 20 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e  o substitutes on
1c6f0 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a   p->pPrior too *
1c700 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
1c710 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53  pSrc;.  struct S
1c720 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1c730 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1c740 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a  f( !p ) return;.
1c750 20 20 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45    do{.    substE
1c760 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1c770 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
1c780 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1c790 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70 42  ubst, p->pGroupB
1c7a0 79 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  y);.    substExp
1c7b0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1c7c0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
1c7d0 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  p->pHaving = sub
1c7e0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1c7f0 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
1c800 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  p->pWhere = subs
1c810 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d  tExpr(pSubst, p-
1c820 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 70 53  >pWhere);.    pS
1c830 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
1c840 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
1c850 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  0 );.    for(i=p
1c860 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d  Src->nSrc, pItem
1c870 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69  =pSrc->a; i>0; i
1c880 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
1c890 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
1c8a0 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 70  pSubst, pItem->p
1c8b0 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20  Select, 1);.    
1c8c0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1c8d0 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
1c8e0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1c8f0 73 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  st(pSubst, pItem
1c900 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a  ->u1.pFuncArg);.
1c910 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c920 7d 77 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20  }while( doPrior 
1c930 26 26 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f  && (p = p->pPrio
1c940 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69  r)!=0 );.}.#endi
1c950 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
1c960 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1c970 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1c980 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1c990 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
1c9a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1c9b0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1c9c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1c9d0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
1c9e0 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
1c9f0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
1ca00 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65  bqueries as a pe
1ca10 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
1ca20 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  zation..** This 
1ca30 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1ca40 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
1ca50 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
1ca60 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63  o flattening occ
1ca70 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
1ca80 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
1ca90 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
1caa0 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
1cab0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
1cac0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
1cad0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
1cae0 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
1caf0 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
1cb00 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
1cb10 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
1cb20 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
1cb30 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
1cb40 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
1cb50 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
1cb60 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
1cb70 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
1cb80 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
1cb90 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
1cba0 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
1cbb0 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
1cbc0 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
1cbd0 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
1cbe0 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
1cbf0 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
1cc00 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
1cc10 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
1cc20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
1cc30 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
1cc40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1cc50 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
1cc60 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
1cc70 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
1cc80 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
1cc90 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
1cca0 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
1ccb0 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
1ccc0 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
1ccd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
1cce0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1ccf0 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
1cd00 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
1cd10 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
1cd20 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69   for this simpli
1cd30 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
1cd40 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
1cd50 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
1cd60 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
1cd70 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
1cd80 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
1cd90 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
1cda0 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
1cdb0 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
1cdc0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
1cdd0 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
1cde0 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
1cdf0 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
1ce00 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
1ce10 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1ce20 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
1ce30 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1ce40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1ce50 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
1ce60 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
1ce70 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
1ce80 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1ce90 61 67 67 72 65 67 61 74 65 20 6f 72 20 28 32 61  aggregate or (2a
1cea0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1ceb0 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  y is not a join.
1cec0 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 28 32  **        and (2
1ced0 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  b) the outer que
1cee0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1cef0 73 75 62 71 75 65 72 69 65 73 20 6f 74 68 65 72  subqueries other
1cf00 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 0a 2a 2a   than the one.**
1cf10 20 20 20 20 20 20 20 20 46 52 4f 4d 2d 63 6c 61          FROM-cla
1cf20 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61  use subquery tha
1cf30 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  t is a candidate
1cf40 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e   for flattening.
1cf50 20 20 28 32 62 20 69 73 0a 2a 2a 20 20 20 20 20    (2b is.**     
1cf60 20 20 20 64 75 65 20 74 6f 20 74 69 63 6b 65 74     due to ticket
1cf70 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61 62   [2f7170d73bf9ab
1cf80 66 38 30 5d 20 66 72 6f 6d 20 32 30 31 35 2d 30  f80] from 2015-0
1cf90 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1cfa0 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
1cfb0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
1cfc0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
1cfd0 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 20 20 20 20  EFT JOIN.**     
1cfe0 20 20 20 6f 72 20 74 68 65 20 73 75 62 71 75 65     or the subque
1cff0 72 79 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66  ry is not itself
1d000 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
1d010 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1d020 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
1d030 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  CT..**.**  (**) 
1d040 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65   At one point re
1d050 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61  strictions (4) a
1d060 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61  nd (5) defined a
1d070 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49   subset of DISTI
1d080 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  NCT.**        su
1d090 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77  b-queries that w
1d0a0 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  ere excluded fro
1d0b0 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  m this optimizat
1d0c0 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e  ion. Restriction
1d0d0 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20   .**        (4) 
1d0e0 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65  has since been e
1d0f0 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75  xpanded to exclu
1d100 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20  de all DISTINCT 
1d110 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  subqueries..**.*
1d120 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
1d130 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1d140 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
1d150 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d160 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
1d170 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
1d180 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
1d190 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
1d1a0 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1d1b0 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1d1c0 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1d1d0 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1d1e0 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1d1f0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77   a FROM clause w
1d200 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1d210 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1d220 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1d230 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1d240 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1d250 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1d260 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1d270 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
1d280 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1d290 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1d2a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1d2b0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
1d2c0 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
1d2d0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1d2e0 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1d2f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
1d300 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
1d310 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
1d320 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65 73  **.**  (**)  Res
1d330 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77 61  triction (10) wa
1d340 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
1d350 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35 2d  he code on 2005-
1d360 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a 20  02-05 but we.** 
1d370 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74 6c         accidentl
1d380 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63 6f  y carried the co
1d390 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75 6e  mment forward un
1d3a0 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e 20  til 2014-09-15. 
1d3b0 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   Original.**    
1d3c0 20 20 20 20 74 65 78 74 3a 20 22 54 68 65 20 73      text: "The s
1d3d0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1d3e0 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
1d3f0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1d400 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 64 6f  ry .**        do
1d410 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1d420 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1d430 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1d440 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d450 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
1d460 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1d470 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
1d480 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
1d490 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
1d4a0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
1d4b0 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
1d4c0 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
1d4d0 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
1d4e0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
1d4f0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
1d500 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
1d510 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
1d520 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1d530 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
1d540 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
1d550 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1d560 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
1d570 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
1d580 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1d590 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
1d5a0 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
1d5b0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
1d5c0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
1d5d0 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  ave a LIMIT clau
1d5e0 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
1d5f0 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20  ee ticket #2339 
1d600 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38  and ticket [02a8
1d610 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20  e81d44])..**.** 
1d620 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72   (16)  The outer
1d630 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e   query is not an
1d640 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
1d650 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a  e subquery does.
1d660 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f  **        not co
1d670 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20  ntain ORDER BY. 
1d680 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
1d690 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
1d6a0 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
1d6b0 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
1d6c0 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
1d6d0 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
1d6e0 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
1d6f0 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79  )  The sub-query
1d700 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75   is not a compou
1d710 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74  nd select, or it
1d720 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
1d730 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1d740 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20  und clause made 
1d750 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e  up entirely of n
1d760 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
1d770 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20  ries, and .**   
1d780 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20       the parent 
1d790 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
1d7a0 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69        * is not i
1d7b0 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20  tself part of a 
1d7c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1d7d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
1d7e0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
1d7f0 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71  te or DISTINCT q
1d800 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  uery, and.**    
1d810 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
1d820 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   join.**.**     
1d830 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
1d840 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
1d850 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
1d860 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
1d870 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
1d880 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
1d890 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
1d8a0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
1d8b0 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
1d8c0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1d8d0 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  T clauses.  The 
1d8e0 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  subquery cannot 
1d8f0 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  use any compound
1d900 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
1d910 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55  tor other than U
1d920 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65  NION ALL because
1d930 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
1d940 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1d950 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65    operators have
1d960 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54   an implied DIST
1d970 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69  INCT which is di
1d980 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20  sallowed by.**  
1d990 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f        restrictio
1d9a0 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  n (4)..**.**    
1d9b0 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63      Also, each c
1d9c0 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20  omponent of the 
1d9d0 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72  sub-query must r
1d9e0 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
1d9f0 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
1da00 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
1da10 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61  s. This is actua
1da20 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e  lly a requiremen
1da30 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75  t for any compou
1da40 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  nd.**        SEL
1da50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ECT statement, b
1da60 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20  ut all the code 
1da70 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b  here does is mak
1da80 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a  e sure that no.*
1da90 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69  *        such (i
1daa0 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72  llegal) sub-quer
1dab0 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20  y is flattened. 
1dac0 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
1dad0 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20  detect the.**   
1dae0 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f       syntax erro
1daf0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  r and return a d
1db00 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e  etailed message.
1db10 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
1db20 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1db30 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
1db40 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
1db50 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
1db60 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c       ORDER by cl
1db70 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
1db80 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
1db90 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
1dba0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
1dbb0 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
1dbc0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
1dbd0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1dbe0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
1dbf0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
1dc00 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
1dc10 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
1dc20 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
1dc30 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
1dc40 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1dc50 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1dc60 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
1dc70 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
1dc80 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1dc90 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
1dca0 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
1dcb0 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
1dcc0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
1dcd0 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
1dce0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
1dcf0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1dd00 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
1dd10 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
1dd20 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
1dd30 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1dd40 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
1dd50 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
1dd60 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
1dd70 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
1dd80 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
1dd90 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
1dda0 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  21)  The subquer
1ddb0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1ddc0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1ddd0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
1dde0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
1ddf0 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
1de00 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
1de10 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
1de20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1de30 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
1de40 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68  .**.**  (23)  Th
1de50 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20  e parent is not 
1de60 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c  a recursive CTE,
1de70 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72   or the sub-quer
1de80 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20  y is not a.**   
1de90 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75       compound qu
1dea0 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69  ery. This restri
1deb0 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
1dec0 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
1ded0 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
1dee0 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
1def0 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
1df00 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
1df10 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
1df20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
1df30 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
1df40 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20  ()..**.**  (24) 
1df50 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1df60 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1df70 65 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  e that uses the 
1df80 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f  built-in min() o
1df90 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20  r .**        or 
1dfa0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  max() functions.
1dfb0 20 20 28 57 69 74 68 6f 75 74 20 74 68 69 73 20    (Without this 
1dfc0 72 65 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71  restriction, a q
1dfd0 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20  uery like:.**   
1dfe0 20 20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46       "SELECT x F
1dff0 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28  ROM (SELECT max(
1e000 79 29 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20  y), x FROM t1)" 
1e010 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73  would not necess
1e020 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  arily.**        
1e030 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
1e040 20 58 20 66 6f 72 20 77 68 69 63 68 20 59 20 77   X for which Y w
1e050 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a  as maximal.).**.
1e060 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f  **.** In this ro
1e070 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70  utine, the "p" p
1e080 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
1e090 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74  inter to the out
1e0a0 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  er query..** The
1e0b0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e   subquery is p->
1e0c0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20  pSrc->a[iFrom]. 
1e0d0 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20 69   isAgg is true i
1e0e0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1e0f0 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67  y.** uses aggreg
1e100 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65 72  ates and subquer
1e110 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20 69  yIsAgg is true i
1e120 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1e130 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e 0a  ses aggregates..
1e140 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  **.** If flatten
1e150 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ing is not attem
1e160 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  pted, this routi
1e170 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e  ne is a no-op an
1e180 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20  d returns 0..** 
1e190 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1e1a0 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73 20   attempted this 
1e1b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1e1c0 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20  1..**.** All of 
1e1d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
1e1e0 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63 63  nalysis must occ
1e1f0 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f  ur on both the o
1e200 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a 2a  uter query and.*
1e210 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20 62  * the subquery b
1e220 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1e230 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74  ne runs..*/.stat
1e240 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53 75  ic int flattenSu
1e250 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  bquery(.  Parse 
1e260 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
1e270 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1e280 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
1e290 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1e2a0 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75 74  he parent or out
1e2b0 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  er SELECT statem
1e2c0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ent */.  int iFr
1e2d0 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om,           /*
1e2e0 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53 72   Index in p->pSr
1e2f0 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e  c->a[] of the in
1e300 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ner subquery */.
1e310 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20 20    int isAgg,    
1e320 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e330 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 75  f outer SELECT u
1e340 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1e350 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  nctions */.  int
1e360 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 20   subqueryIsAgg  
1e370 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1e380 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1e390 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1e3a0 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ns */.){.  const
1e3b0 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
1e3c0 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  hContext = pPars
1e3d0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
1e3e0 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65  .  Select *pPare
1e3f0 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e  nt;    /* Curren
1e400 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d  t UNION ALL term
1e410 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71 75   of the other qu
1e420 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ery */.  Select 
1e430 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
1e440 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
1e450 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
1e460 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
1e470 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
1e480 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
1e490 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
1e4a0 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
1e4b0 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
1e4c0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1e4d0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1e4e0 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
1e4f0 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
1e500 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1e510 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1e520 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
1e530 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
1e540 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1e550 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1e560 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
1e570 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
1e580 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
1e590 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
1e5a0 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
1e5b0 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50 61   */.  int iNewPa
1e5c0 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65 70  rent = -1;/* Rep
1e5d0 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20 66  lacement table f
1e5e0 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20 20  or iParent */.  
1e5f0 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d  int isLeftJoin =
1e600 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 70   0; /* True if p
1e610 53 75 62 20 69 73 20 74 68 65 20 72 69 67 68 74  Sub is the right
1e620 20 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54 20   side of a LEFT 
1e630 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69 6e  JOIN */    .  in
1e640 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1e650 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1e660 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  r */.  Expr *pWh
1e670 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ere;            
1e680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1e690 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1e6a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1e6b0 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20  item *pSubitem; 
1e6c0 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
1e6d0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
1e6e0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e6f0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
1e700 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e  see if flattenin
1e710 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
1e720 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74   Return 0 if not
1e730 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1e740 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
1e750 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
1e760 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f  );  /* Unable to
1e770 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e   flatten compoun
1e780 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69  d queries */.  i
1e790 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
1e7a0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
1e7b0 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65  TE_QueryFlattene
1e7c0 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
1e7d0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1e7e0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
1e7f0 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
1e800 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
1e810 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
1e820 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
1e830 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
1e840 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
1e850 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
1e860 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
1e870 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
1e880 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
1e890 73 41 67 67 20 29 7b 0a 20 20 20 20 69 66 28 20  sAgg ){.    if( 
1e8a0 69 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  isAgg ) return 0
1e8b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1e8e0 28 31 29 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  (1)   */.    if(
1e8f0 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20   pSrc->nSrc>1 ) 
1e900 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e930 20 28 32 61 29 20 20 2a 2f 0a 20 20 20 20 69 66   (2a)  */.    if
1e940 28 20 28 70 2d 3e 70 57 68 65 72 65 20 26 26 20  ( (p->pWhere && 
1e950 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1e960 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f 53 75 62  p->pWhere,EP_Sub
1e970 71 75 65 72 79 29 29 0a 20 20 20 20 20 7c 7c 20  query)).     || 
1e980 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1e990 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69 73 74 29  Flags(p->pEList)
1e9a0 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21   & EP_Subquery)!
1e9b0 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69  =0.     || (sqli
1e9c0 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
1e9d0 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 26 20  (p->pOrderBy) & 
1e9e0 45 50 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a  EP_Subquery)!=0.
1e9f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1ea00 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea30 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ea40 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  2b)  */.    }.  
1ea50 7d 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  }..  pSubSrc = p
1ea60 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
1ea70 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
1ea80 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
1ea90 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
1eaa0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1eab0 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
1eac0 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
1ead0 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
1eae0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
1eaf0 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
1eb00 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
1eb10 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1eb20 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
1eb30 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1eb40 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1eb50 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
1eb60 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
1eb70 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
1eb80 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
1eb90 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
1eba0 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
1ebb0 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
1ebc0 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
1ebd0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1ebe0 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
1ebf0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ec00 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ec10 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
1ec20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20  pSub->pOffset ) 
1ec30 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ec60 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
1ec70 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1ec80 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
1ec90 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
1eca0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ece0 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
1ecf0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1ed00 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
1ed10 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed30 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
1ed40 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1ed50 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1ed60 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1ed70 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
1ed80 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
1ed90 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1eda0 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
1edb0 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
1edc0 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
1edd0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1ede0 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
1edf0 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
1ee00 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1ee10 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1ee20 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1ee30 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
1ee40 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1ee50 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
1ee60 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
1ee70 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
1ee80 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1ee90 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eec0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1eed0 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
1eee0 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
1eef0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1ef00 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1ef10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ef20 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
1ef30 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1ef40 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
1ef50 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
1ef60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ef70 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
1ef80 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1ef90 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
1efa0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1efb0 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
1efc0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1efd0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1efe0 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 74 65  (21) */.  }.  te
1eff0 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e 73 65  stcase( pSub->se
1f000 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1f010 72 73 69 76 65 20 29 3b 0a 20 20 74 65 73 74 63  rsive );.  testc
1f020 61 73 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c  ase( pSub->selFl
1f030 61 67 73 20 26 20 53 46 5f 4d 69 6e 4d 61 78 41  ags & SF_MinMaxA
1f040 67 67 20 29 3b 0a 20 20 69 66 28 20 70 53 75 62  gg );.  if( pSub
1f050 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1f060 5f 52 65 63 75 72 73 69 76 65 7c 53 46 5f 4d 69  _Recursive|SF_Mi
1f070 6e 4d 61 78 41 67 67 29 20 29 7b 0a 20 20 20 20  nMaxAgg) ){.    
1f080 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1f090 74 72 69 63 74 69 6f 6e 73 20 28 32 32 29 20 61  trictions (22) a
1f0a0 6e 64 20 28 32 34 29 20 2a 2f 0a 20 20 7d 0a 20  nd (24) */.  }. 
1f0b0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1f0c0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1f0d0 29 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f  ) && pSub->pPrio
1f0e0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
1f0f0 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
1f100 6e 20 28 32 33 29 20 2a 2f 0a 20 20 7d 0a 0a 20  n (23) */.  }.. 
1f110 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
1f120 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1f130 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1f140 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68   a LEFT JOIN, th
1f150 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  en the.  ** subq
1f160 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1f170 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66 2e 20 20  a join itself.  
1f180 45 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74  Example of why t
1f190 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  his is not allow
1f1a0 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
1f1b0 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55        t1 LEFT OU
1f1c0 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49  TER JOIN (t2 JOI
1f1d0 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  N t3).  **.  ** 
1f1e0 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68  If we flatten th
1f1f0 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c  e above, we woul
1f200 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d get.  **.  ** 
1f210 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54          (t1 LEFT
1f220 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20   OUTER JOIN t2) 
1f230 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a  JOIN t3.  **.  *
1f240 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61  * which is not a
1f250 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74  t all the same t
1f260 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hing..  **.  ** 
1f270 53 65 65 20 61 6c 73 6f 20 74 69 63 6b 65 74 73  See also tickets
1f280 20 23 33 30 36 2c 20 23 33 35 30 2c 20 61 6e 64   #306, #350, and
1f290 20 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3300..  */.  i
1f2a0 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67  f( (pSubitem->fg
1f2b0 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
1f2c0 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20  UTER)!=0 ){.    
1f2d0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a  isLeftJoin = 1;.
1f2e0 20 20 20 20 69 66 28 20 70 53 75 62 53 72 63 2d      if( pSubSrc-
1f2f0 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
1f300 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
1f310 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
1f320 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f330 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
1f340 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
1f350 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
1f360 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
1f370 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
1f380 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
1f390 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
1f3a0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
1f3b0 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
1f3c0 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
1f3d0 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
1f3e0 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
1f3f0 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
1f400 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
1f410 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
1f420 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
1f430 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1f440 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
1f450 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1f460 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
1f470 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
1f480 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
1f490 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1f4a0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
1f4b0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
1f4c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1f4d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1f4e0 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
1f4f0 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
1f500 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
1f510 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1f520 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1f530 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1f540 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
1f550 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
1f560 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
1f570 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1f580 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1f590 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
1f5a0 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
1f5b0 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
1f5c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
1f5d0 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73  ert( pSub->pELis
1f5e0 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d  t->nExpr==pSub1-
1f5f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
1f600 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
1f610 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1f620 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1f630 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20 20  ggregate))!=0.  
1f640 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e       || (pSub1->
1f650 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d  pPrior && pSub1-
1f660 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20  >op!=TK_ALL) .  
1f670 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70       || pSub1->p
1f680 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20 20  Src->nSrc<1.    
1f690 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1f6a0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1f6b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1f6c0 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1f6d0 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1f6e0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f6f0 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  18. */.    if( p
1f700 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1f710 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1f720 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1f730 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1f740 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
1f750 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1f760 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
1f770 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
1f780 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1f790 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
1f7a0 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
1f7b0 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
1f7c0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1f7d0 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45  ted. *****/.  SE
1f7e0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
1f7f0 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20 25  se,p,("flatten %
1f800 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20 25  s.%p from term %
1f810 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1f820 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 7a           pSub->z
1f830 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20 69  SelName, pSub, i
1f840 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41 75  From));..  /* Au
1f850 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71  thorize the subq
1f860 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65  uery */.  pParse
1f870 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
1f880 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1f890 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d  ;.  TESTONLY(i =
1f8a0 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ) sqlite3AuthChe
1f8b0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1f8c0 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
1f8d0 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  0);.  testcase( 
1f8e0 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  i==SQLITE_DENY )
1f8f0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  ;.  pParse->zAut
1f900 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
1f910 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  dAuthContext;.. 
1f920 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71   /* If the sub-q
1f930 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1f940 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
1f950 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65  ent, then (by re
1f960 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  strictions.  ** 
1f970 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29  17 and 18 above)
1f980 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e   it must be a UN
1f990 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20  ION ALL and the 
1f9a0 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73  parent query mus
1f9b0 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68  t .  ** be of th
1f9c0 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
1f9d0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78  *     SELECT <ex
1f9e0 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c  pr-list> FROM (<
1f9f0 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65  sub-query>) <whe
1fa00 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a  re-clause> .  **
1fa10 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62  .  ** followed b
1fa20 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20  y any ORDER BY, 
1fa30 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46  LIMIT and/or OFF
1fa40 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69  SET clauses. Thi
1fa50 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65  s block.  ** cre
1fa60 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20  ates N-1 copies 
1fa70 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  of the parent qu
1fa80 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ery without any 
1fa90 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
1faa0 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20  or .  ** OFFSET 
1fab0 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e  clauses and join
1fac0 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65  s them to the le
1fad0 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ft-hand-side of 
1fae0 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
1faf0 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c  * using UNION AL
1fb00 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20  L operators. In 
1fb10 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74  this case N is t
1fb20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d  he number of sim
1fb30 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  ple.  ** select 
1fb40 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
1fb50 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  e compound sub-q
1fb60 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
1fb70 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  Example:.  **.  
1fb80 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
1fb90 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20  1 FROM (.  **   
1fba0 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
1fbb0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
1fbc0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1fbd0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1fbe0 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  y FROM tab.  ** 
1fbf0 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1fc00 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1fc10 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f  ECT abs(z*2) FRO
1fc20 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20  M tab2.  **     
1fc30 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44  ) WHERE a!=5 ORD
1fc40 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
1fc50 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
1fc60 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
1fc70 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f    SELECT x+1 FRO
1fc80 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21  M tab WHERE x+1!
1fc90 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
1fca0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
1fcb0 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74  ELECT y+1 FROM t
1fcc0 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a  ab WHERE y+1!=5.
1fcd0 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
1fce0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
1fcf0 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52  CT abs(z*2)+1 FR
1fd00 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62  OM tab2 WHERE ab
1fd10 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a  s(z*2)+1!=5.  **
1fd20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a       ORDER BY 1.
1fd30 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c    **.  ** We cal
1fd40 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70  l this the "comp
1fd50 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1fd60 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a  attening"..  */.
1fd70 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d    for(pSub=pSub-
1fd80 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70  >pPrior; pSub; p
1fd90 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1fda0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
1fdb0 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  New;.    ExprLis
1fdc0 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
1fdd0 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45  >pOrderBy;.    E
1fde0 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d  xpr *pLimit = p-
1fdf0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70  >pLimit;.    Exp
1fe00 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r *pOffset = p->
1fe10 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c  pOffset;.    Sel
1fe20 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d  ect *pPrior = p-
1fe30 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
1fe40 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1fe50 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
1fe60 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
1fe70 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20  ;.    p->pLimit 
1fe80 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66  = 0;.    p->pOff
1fe90 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  set = 0;.    pNe
1fea0 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  w = sqlite3Selec
1feb0 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a  tDup(db, p, 0);.
1fec0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1fed0 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70  tSetName(pNew, p
1fee0 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a  Sub->zSelName);.
1fef0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
1ff00 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d   pOffset;.    p-
1ff10 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
1ff20 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1ff30 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
1ff40 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63    p->pSrc = pSrc
1ff50 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ;.    p->op = TK
1ff60 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e  _ALL;.    if( pN
1ff70 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
1ff80 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
1ff90 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1ffa0 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
1ffb0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
1ffc0 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70 50   if( pPrior ) pP
1ffd0 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e  rior->pNext = pN
1ffe0 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ew;.      pNew->
1fff0 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
20000 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
20010 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  w;.      SELECTT
20020 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c  RACE(2,pParse,p,
20030 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d 70  .         ("comp
20040 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
20050 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73 20  attener creates 
20060 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e 22  %s.%p as peer\n"
20070 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ,.         pNew-
20080 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29  >zSelName, pNew)
20090 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
200a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
200b0 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
200c0 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
200d0 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
200e0 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
200f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
20100 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
20110 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
20120 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
20130 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
20140 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
20150 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
20160 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
20170 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
20180 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
20190 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
201a0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
201b0 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
201c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
201d0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
201e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
201f0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
20200 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
20210 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
20220 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
20230 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
20240 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
20250 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
20260 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
20270 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
20280 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
20290 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
202a0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
202b0 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
202c0 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
202d0 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
202e0 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
202f0 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
20300 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
20310 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
20320 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
20330 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
20340 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
20350 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
20360 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
20370 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
20380 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
20390 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
203a0 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
203b0 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
203c0 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
203d0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
203e0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
203f0 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
20400 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  oDel->nTabRef==1
20410 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
20420 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
20430 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
20440 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
20450 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
20460 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
20470 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
20480 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
20490 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
204a0 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
204b0 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
204c0 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b  oDel->nTabRef--;
204d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
204e0 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
204f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
20500 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
20510 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
20520 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
20530 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
20540 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
20550 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
20560 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
20570 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
20580 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
20590 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
205a0 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
205b0 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
205c0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
205d0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
205e0 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
205f0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
20600 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
20610 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
20620 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
20630 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
20640 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
20650 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
20660 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
20670 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
20680 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
20690 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
206a0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
206b0 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
206c0 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
206d0 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
206e0 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
206f0 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
20700 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
20710 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
20720 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
20730 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
20740 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
20750 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
20760 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
20770 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
20780 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
20790 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
207a0 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
207b0 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
207c0 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
207d0 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
207e0 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
207f0 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
20800 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
20810 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
20820 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
20830 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
20840 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
20850 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
20860 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
20870 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
20880 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
20890 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
208a0 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
208b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
208c0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
208d0 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
208e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
208f0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
20900 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
20910 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
20920 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
20930 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
20940 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
20950 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
20960 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
20970 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
20980 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
20990 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
209a0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
209b0 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
209c0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
209d0 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
209e0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
209f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
20a00 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
20a10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
20a20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
20a30 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
20a40 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
20a50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20a60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
20a70 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
20a80 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
20a90 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
20aa0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
20ab0 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
20ac0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
20ad0 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
20ae0 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
20af0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
20b00 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
20b10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20b20 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
20b30 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
20b40 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
20b50 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
20b60 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
20b70 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
20b80 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
20b90 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
20ba0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
20bb0 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
20bc0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
20bd0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
20be0 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
20bf0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
20c00 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
20c10 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
20c20 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
20c30 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
20c40 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
20c50 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
20c60 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
20c70 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
20c80 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  er query FROM cl
20c90 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e  ause to 4 slots.
20ca0 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64  .    ** The midd
20cb0 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  le slot is expan
20cc0 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
20cd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
20ce0 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66  e space.    ** f
20cf0 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65  or the two eleme
20d00 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
20d10 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
20d20 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
20d30 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
20d40 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
20d50 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
20d60 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
20d70 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
20d80 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
20d90 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
20da0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20db0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
20dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20dd0 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
20de0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
20df0 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
20e00 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
20e10 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
20e20 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
20e30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
20e40 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
20e50 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
20e60 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
20e70 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
20e80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20e90 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
20ea0 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ].fg.isTabFunc==
20eb0 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  0 );.      pSrc-
20ec0 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
20ed0 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
20ee0 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20     iNewParent = 
20ef0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  pSubSrc->a[i].iC
20f00 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d  ursor;.      mem
20f10 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
20f20 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
20f30 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
20f40 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
20f50 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
20f60 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
20f70 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
20f80 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
20f90 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
20fa0 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
20fb0 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
20fc0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
20fd0 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
20fe0 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
20ff0 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
21000 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
21010 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
21020 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
21030 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
21040 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
21050 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
21060 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
21070 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
21080 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
21090 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
210a0 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
210b0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
210c0 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
210d0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
210e0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
210f0 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
21100 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
21110 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
21120 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
21130 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
21140 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
21150 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
21160 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
21170 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
21180 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
21190 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
211a0 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72 65     pList = pPare
211b0 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  nt->pEList;.    
211c0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
211d0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
211e0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
211f0 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  a[i].zName==0 ){
21200 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
21210 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
21220 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74  StrDup(db, pList
21230 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
21240 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
21250 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
21260 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69        pList->a[i
21270 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
21280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21290 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
212a0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
212b0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
212c0 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
212d0 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
212e0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
212f0 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
21300 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
21310 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
21320 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
21330 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
21340 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
21350 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
21360 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
21370 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
21380 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
21390 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
213a0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
213b0 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
213c0 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
213d0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
213e0 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
213f0 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
21400 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
21410 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21420 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
21430 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
21440 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
21450 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
21460 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
21470 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
21480 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
21490 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
214a0 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
214b0 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
214c0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
214d0 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
214e0 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
214f0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
21500 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
21510 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
21520 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
21530 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
21540 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
21550 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
21560 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
21570 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
21580 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
21590 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
215a0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
215b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
215c0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
215d0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
215e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
215f0 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b  ub->pPrior==0 );
21600 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
21610 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
21620 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
21630 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
21640 20 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20     }.    pWhere 
21650 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
21660 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72  (db, pSub->pWher
21670 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69  e, 0);.    if( i
21680 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  sLeftJoin ){.   
21690 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
216a0 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65 6e  Where, iNewParen
216b0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
216c0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
216d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
216e0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
216f0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  g==0 );.      pP
21700 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
21710 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
21720 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21730 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
21740 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
21750 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
21760 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 0a 20  e3ExprAnd(db, . 
21770 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21780 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
21790 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 2c 20 70  ->pHaving, 0), p
217a0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 0a  Parent->pHaving.
217b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
217c0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
217d0 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20  pGroupBy==0 );. 
217e0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47       pParent->pG
217f0 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
21800 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
21810 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c 20  pSub->pGroupBy, 
21820 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
21830 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
21840 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
21850 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65  prAnd(db, pWhere
21860 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
21870 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
21880 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
21890 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ed==0 ){.      S
218a0 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20  ubstContext x;. 
218b0 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20       x.pParse = 
218c0 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e  pParse;.      x.
218d0 69 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e 74  iTable = iParent
218e0 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61  ;.      x.iNewTa
218f0 62 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e 74  ble = iNewParent
21900 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74  ;.      x.isLeft
21910 4a 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f 69  Join = isLeftJoi
21920 6e 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  n;.      x.pELis
21930 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  t = pSub->pEList
21940 3b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  ;.      substSel
21950 65 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74 2c  ect(&x, pParent,
21960 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
21970 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e    /* The flatten
21980 65 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74  ed query is dist
21990 69 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74  inct if either t
219a0 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a  he inner or the.
219b0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
219c0 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20  ry is distinct. 
219d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
219e0 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ent->selFlags |=
219f0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
21a00 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20  & SF_Distinct;. 
21a10 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20   .    /*.    ** 
21a20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
21a30 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49  (SELECT ... LIMI
21a40 54 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49  T a OFFSET b) LI
21a50 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a  MIT x OFFSET y;.
21a60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
21a70 65 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20  e is tempted to 
21a80 74 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64  try to add a and
21a90 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68   b to combine th
21aa0 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74  e limits.  But t
21ab0 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20  his.    ** does 
21ac0 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68  not work if eith
21ad0 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  er limit is nega
21ae0 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tive..    */.   
21af0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
21b00 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  t ){.      pPare
21b10 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75  nt->pLimit = pSu
21b20 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  b->pLimit;.     
21b30 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20   pSub->pLimit = 
21b40 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
21b50 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c  /* Finially, del
21b60 65 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74  ete what is left
21b70 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
21b80 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a   and return.  **
21b90 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   success..  */. 
21ba0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
21bb0 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b  lete(db, pSub1);
21bc0 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
21bd0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
21be0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
21bf0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
21c00 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
21c10 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  100,pParse,p,("A
21c20 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a  fter flattening:
21c30 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
21c40 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
21c50 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
21c60 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
21c70 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
21c80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
21c90 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
21ca0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
21cb0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
21cc0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
21cd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
21ce0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
21cf0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
21d00 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f  W)./*.** Make co
21d10 70 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74  pies of relevant
21d20 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
21d30 72 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72  rms of the outer
21d40 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74   query into.** t
21d50 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
21d60 6f 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78  of subquery.  Ex
21d70 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
21d80 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
21d90 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
21da0 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20  d AS y FROM t1) 
21db0 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
21dc0 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66  10;.**.** Transf
21dd0 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a  ormed into:.**.*
21de0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
21df0 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
21e00 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
21e10 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e   t1 WHERE a=5 AN
21e20 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20  D c-d=10).**    
21e30 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79   WHERE x=5 AND y
21e40 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68  =10;.**.** The h
21e50 6f 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20  ope is that the 
21e60 74 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74  terms added to t
21e70 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77  he inner query w
21e80 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65  ill make it more
21e90 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  .** efficient..*
21ea0 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65  *.** Do not atte
21eb0 6d 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  mpt this optimiz
21ec0 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  ation if:.**.** 
21ed0 20 20 28 31 29 20 54 68 65 20 69 6e 6e 65 72 20    (1) The inner 
21ee0 71 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72  query is an aggr
21ef0 65 67 61 74 65 2e 20 20 28 49 6e 20 74 68 61 74  egate.  (In that
21f00 20 63 61 73 65 2c 20 77 65 27 64 20 72 65 61 6c   case, we'd real
21f10 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20 20 20 20  ly want.**      
21f20 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6f 75 74   to copy the out
21f30 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  er WHERE-clause 
21f40 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 48  terms onto the H
21f50 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  AVING clause of 
21f60 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 6e  the.**       inn
21f70 65 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 74  er query.  But t
21f80 68 65 79 20 70 72 6f 62 61 62 6c 79 20 77 6f 6e  hey probably won
21f90 27 74 20 68 65 6c 70 20 74 68 65 72 65 20 73 6f  't help there so
21fa0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 2e 29   do not bother.)
21fb0 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65  .**.**   (2) The
21fc0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
21fd0 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61  the recursive pa
21fe0 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74  rt of a common t
21ff0 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
22000 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  .**.**   (3) The
22010 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73   inner query has
22020 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
22030 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67  (since the chang
22040 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  es to the WHERE.
22050 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65 20 77  **       close w
22060 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65 20  ould change the 
22070 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c  meaning of the L
22080 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  IMIT)..**.**   (
22090 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  4) The inner que
220a0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
220b0 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46  operand of a LEF
220c0 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65 20 63 61  T JOIN.  (The ca
220d0 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e  ller.**       en
220e0 66 6f 72 63 65 73 20 74 68 69 73 20 72 65 73 74  forces this rest
220f0 72 69 63 74 69 6f 6e 20 73 69 6e 63 65 20 74 68  riction since th
22100 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
22110 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75 67 68 0a  not have enough.
22120 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f 72 6d 61  **       informa
22130 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a  tion to know.).*
22140 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68 65 20 57  *.**   (5) The W
22150 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72  HERE clause expr
22160 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
22170 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  s in the ON or U
22180 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20  SING clause.**  
22190 20 20 20 20 20 6f 66 20 61 20 4c 45 46 54 20 4a       of a LEFT J
221a0 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  OIN..**.** Retur
221b0 6e 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65  n 0 if no change
221c0 73 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e  s are made and n
221d0 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f  on-zero if one o
221e0 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61  r more WHERE cla
221f0 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65  use.** terms are
22200 20 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f   duplicated into
22210 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
22220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 73  /.static int pus
22230 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
22240 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
22250 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
22260 65 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d  e context (for m
22270 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f  alloc() and erro
22280 72 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a  r reporting) */.
22290 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c    Select *pSubq,
222a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
222b0 75 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48  ubquery whose WH
222c0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f  ERE clause is to
222d0 20 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f   be augmented */
222e0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
222f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22300 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
22310 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
22320 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72  */.  int iCursor
22330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
22340 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74  rsor number of t
22350 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29  he subquery */.)
22360 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
22370 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b    int nChng = 0;
22380 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 20 20  .  Select *pX;  
22390 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
223a0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 63 6f 6d  looping over com
223b0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 69 6e  pound SELECTs in
223c0 20 70 53 75 62 71 20 2a 2f 0a 20 20 69 66 28 20   pSubq */.  if( 
223d0 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74 75  pWhere==0 ) retu
223e0 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70 58 3d 70  rn 0;.  for(pX=p
223f0 53 75 62 71 3b 20 70 58 3b 20 70 58 3d 70 58 2d  Subq; pX; pX=pX-
22400 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 66  >pPrior){.    if
22410 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20  ( (pX->selFlags 
22420 26 20 28 53 46 5f 41 67 67 72 65 67 61 74 65 7c  & (SF_Aggregate|
22430 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 21 3d  SF_Recursive))!=
22440 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
22450 61 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c 61 67  ase( pX->selFlag
22460 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
22470 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
22480 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c 61 67 73  se( pX->selFlags
22490 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
224a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
224b0 65 28 20 70 58 21 3d 70 53 75 62 71 20 29 3b 0a  e( pX!=pSubq );.
224c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
224d0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  /* restrictions 
224e0 28 31 29 20 61 6e 64 20 28 32 29 20 2a 2f 0a 20  (1) and (2) */. 
224f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
22500 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20  Subq->pLimit!=0 
22510 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
22520 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20   /* restriction 
22530 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69  (3) */.  }.  whi
22540 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d  le( pWhere->op==
22550 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43  TK_AND ){.    nC
22560 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57  hng += pushDownW
22570 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65  hereTerms(pParse
22580 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d  , pSubq, pWhere-
22590 3e 70 52 69 67 68 74 2c 20 69 43 75 72 73 6f 72  >pRight, iCursor
225a0 29 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  );.    pWhere = 
225b0 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20  pWhere->pLeft;. 
225c0 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
225d0 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
225e0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72  EP_FromJoin) ) r
225f0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
22600 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a 20 20 69  riction 5 */.  i
22610 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
22620 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57  TableConstant(pW
22630 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29  here, iCursor) )
22640 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20  {.    nChng++;. 
22650 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20     while( pSubq 
22660 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f  ){.      SubstCo
22670 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70  ntext x;.      p
22680 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
22690 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
226a0 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20   pWhere, 0);.   
226b0 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50     x.pParse = pP
226c0 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54  arse;.      x.iT
226d0 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
226e0 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c        x.iNewTabl
226f0 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
22700 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
22710 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c  = 0;.      x.pEL
22720 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c  ist = pSubq->pEL
22730 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ist;.      pNew 
22740 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c 20  = substExpr(&x, 
22750 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 53 75  pNew);.      pSu
22760 62 71 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  bq->pWhere = sql
22770 69 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72  ite3ExprAnd(pPar
22780 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70  se->db, pSubq->p
22790 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
227a0 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75 62      pSubq = pSub
227b0 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d  q->pPrior;.    }
227c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
227d0 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  hng;.}.#endif /*
227e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
227f0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
22800 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
22810 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
22820 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
22830 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22840 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
22850 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
22860 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
22870 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
22880 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
22890 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
228a0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
228b0 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
228c0 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
228d0 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
228e0 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
228f0 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
22900 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
22910 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
22920 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
22930 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
22940 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
22950 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
22960 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
22970 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
22980 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
22990 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
229a0 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
229b0 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
229c0 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
229d0 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
229e0 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
229f0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
22a00 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
22a10 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
22a20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
22a30 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
22a40 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
22a50 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
22a60 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
22a70 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
22a80 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
22a90 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
22aa0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
22ab0 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
22ac0 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
22ad0 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
22ae0 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
22af0 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
22b00 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
22b10 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
22b20 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
22b30 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
22b40 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
22b50 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
22b60 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
22b70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
22b80 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
22b90 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
22ba0 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
22bb0 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
22bc0 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
22bd0 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
22be0 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
22bf0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
22c00 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
22c10 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
22c20 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
22c30 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
22c40 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
22c50 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
22c60 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
22c70 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
22c80 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
22c90 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
22ca0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
22cb0 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
22cc0 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
22cd0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
22ce0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
22cf0 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
22d00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
22d10 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
22d20 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
22d30 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
22d40 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
22d50 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
22d60 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
22d70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22d80 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
22d90 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
22da0 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
22db0 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
22dc0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
22dd0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
22de0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
22df0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
22e00 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
22e10 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
22e20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
22e30 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61  the associated a
22e40 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62  ggregate-info ob
22e50 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ject. This .** f
22e60 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66  unction tests if
22e70 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f   the SELECT is o
22e80 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
22e90 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
22ea0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a  (*) FROM <tbl>.*
22eb0 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65  *.** where table
22ec0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74   is a database t
22ed0 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d  able, not a sub-
22ee0 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20  select or view. 
22ef0 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  If the query.** 
22f00 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20  does match this 
22f10 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20  pattern, then a 
22f20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54  pointer to the T
22f30 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72  able object repr
22f40 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c  esenting.** <tbl
22f50 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  > is returned. O
22f60 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
22f70 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
22f80 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70  ic Table *isSimp
22f90 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a  leCount(Select *
22fa0 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  p, AggInfo *pAgg
22fb0 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Info){.  Table *
22fc0 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  pTab;.  Expr *pE
22fd0 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  xpr;..  assert( 
22fe0 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a  !p->pGroupBy );.
22ff0 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
23000 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
23010 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70  Expr!=1 .   || p
23020 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  ->pSrc->nSrc!=1 
23030 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d  || p->pSrc->a[0]
23040 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20  .pSelect.  ){.  
23050 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
23060 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63    pTab = p->pSrc
23070 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70  ->a[0].pTab;.  p
23080 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74  Expr = p->pEList
23090 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
230a0 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
230b0 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26  !pTab->pSelect &
230c0 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66  & pExpr );..  if
230d0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
230e0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
230f0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
23100 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
23110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
23120 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d   NEVER(pAggInfo-
23130 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74  >nFunc==0) ) ret
23140 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41  urn 0;.  if( (pA
23150 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d  ggInfo->aFunc[0]
23160 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  .pFunc->funcFlag
23170 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  s&SQLITE_FUNC_CO
23180 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  UNT)==0 ) return
23190 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
231a0 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e  >flags&EP_Distin
231b0 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  ct ) return 0;..
231c0 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
231d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ../*.** If the s
231e0 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20  ource-list item 
231f0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
23200 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e  ument was augmen
23210 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49  ted with an.** I
23220 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
23230 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f  , then try to lo
23240 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69  cate the specifi
23250 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  ed index. If the
23260 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61  re.** was such a
23270 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20   clause and the 
23280 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e  named index cann
23290 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74  ot be found, ret
232a0 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  urn .** SQLITE_E
232b0 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61  RROR and leave a
232c0 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
232d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f  e. Otherwise, po
232e0 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d  pulate .** pFrom
232f0 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74  ->pIndex and ret
23300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
23310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64  /.int sqlite3Ind
23320 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72  exedByLookup(Par
23330 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
23340 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
23350 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
23360 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46  From->pTab && pF
23370 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65  rom->fg.isIndexe
23380 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  dBy ){.    Table
23390 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pTab = pFrom->
233a0 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a  pTab;.    char *
233b0 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72  zIndexedBy = pFr
233c0 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42  om->u1.zIndexedB
233d0 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  y;.    Index *pI
233e0 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
233f0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a  =pTab->pIndex; .
23400 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20          pIdx && 
23410 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
23420 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64  Idx->zName, zInd
23430 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20  exedBy); .      
23440 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
23450 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
23460 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
23470 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
23480 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
23490 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
234a0 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20  ndexedBy, 0);.  
234b0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
234c0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
234d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
234e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
234f0 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65    pFrom->pIBInde
23500 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20  x = pIdx;.  }.  
23510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23520 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74  ;.}./*.** Detect
23530 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
23540 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
23550 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59   use an ORDER BY
23560 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a   clause with .**
23570 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
23580 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
23590 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ce..**.**    SEL
235a0 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
235b0 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
235c0 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  . FROM t2 ORDER 
235d0 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  BY .. COLLATE ..
235e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ..**.** These ar
235f0 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
23600 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a   subquery:.**.**
23610 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23620 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  M (SELECT ... FR
23630 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
23640 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29  ECT ... FROM t2)
23650 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59  .**     ORDER BY
23660 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e   ... COLLATE ...
23670 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
23680 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  sformation is ne
23690 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
236a0 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  the multiSelectO
236b0 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65  rderBy() routine
236c0 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67  .** above that g
236d0 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
236e0 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  e for a compound
236f0 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20   SELECT with an 
23700 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
23710 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20  ** uses a merge 
23720 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72  algorithm that r
23730 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65  equires the same
23740 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
23750 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65  nce on the.** re
23760 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20  sult columns as 
23770 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  on the ORDER BY 
23780 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63  clause.  See tic
23790 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77  ket.** http://ww
237a0 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63  w.sqlite.org/src
237b0 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61  /info/6709574d2a
237c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e  .**.** This tran
237d0 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e  sformation is on
237e0 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58  ly needed for EX
237f0 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c  CEPT, INTERSECT,
23800 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54   and UNION..** T
23810 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
23820 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65  rator works fine
23830 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63   with multiSelec
23840 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20  tOrderBy() even 
23850 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72  when.** there ar
23860 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20  e COLLATE terms 
23870 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  in the ORDER BY.
23880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
23890 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
238a0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57  lectToSubquery(W
238b0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
238c0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e  Select *p){.  in
238d0 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  t i;.  Select *p
238e0 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  New;.  Select *p
238f0 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  X;.  sqlite3 *db
23900 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
23910 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53  ist_item *a;.  S
23920 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b  rcList *pNewSrc;
23930 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
23940 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b  ;.  Token dummy;
23950 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  ..  if( p->pPrio
23960 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  r==0 ) return WR
23970 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66  C_Continue;.  if
23980 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
23990 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
239a0 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58  ntinue;.  for(pX
239b0 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f  =p; pX && (pX->o
239c0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d  p==TK_ALL || pX-
239d0 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b  >op==TK_SELECT);
239e0 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b   pX=pX->pPrior){
239f0 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20  }.  if( pX==0 ) 
23a00 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23a10 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f  nue;.  a = p->pO
23a20 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72  rderBy->a;.  for
23a30 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  (i=p->pOrderBy->
23a40 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69  nExpr-1; i>=0; i
23a50 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69  --){.    if( a[i
23a60 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ].pExpr->flags &
23a70 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72   EP_Collate ) br
23a80 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eak;.  }.  if( i
23a90 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  <0 ) return WRC_
23aa0 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20  Continue;..  /* 
23ab0 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
23ac0 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61   point, that mea
23ad0 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  ns the transform
23ae0 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ation is require
23af0 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  d. */..  pParse 
23b00 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
23b10 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
23b20 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
23b30 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
23b40 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
23b50 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
23b60 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ew==0 ) return W
23b70 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73  RC_Abort;.  mems
23b80 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69  et(&dummy, 0, si
23b90 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20  zeof(dummy));.  
23ba0 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65  pNewSrc = sqlite
23bb0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
23bc0 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c  omTerm(pParse,0,
23bd0 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c  0,0,&dummy,pNew,
23be0 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  0,0);.  if( pNew
23bf0 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
23c00 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e  WRC_Abort;.  *pN
23c10 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53  ew = *p;.  p->pS
23c20 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20  rc = pNewSrc;.  
23c30 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  p->pEList = sqli
23c40 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
23c50 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c  d(pParse, 0, sql
23c60 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
23c70 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20  ASTERISK, 0));. 
23c80 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45   p->op = TK_SELE
23c90 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20  CT;.  p->pWhere 
23ca0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  = 0;.  pNew->pGr
23cb0 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65  oupBy = 0;.  pNe
23cc0 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a  w->pHaving = 0;.
23cd0 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
23ce0 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f   = 0;.  p->pPrio
23cf0 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78  r = 0;.  p->pNex
23d00 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74  t = 0;.  p->pWit
23d10 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46  h = 0;.  p->selF
23d20 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70  lags &= ~SF_Comp
23d30 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20  ound;.  assert( 
23d40 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
23d50 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20  F_Converted)==0 
23d60 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
23d70 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64   |= SF_Converted
23d80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
23d90 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20  ->pPrior!=0 );. 
23da0 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70   pNew->pPrior->p
23db0 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
23dc0 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b  New->pLimit = 0;
23dd0 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74  .  pNew->pOffset
23de0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
23df0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
23e00 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
23e10 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63  ee if the FROM c
23e20 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d  lause term pFrom
23e30 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65   has table-value
23e40 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72  d function.** ar
23e50 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20  guments.  If it 
23e60 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  does, leave an e
23e70 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
23e80 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
23e90 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73  n.** non-zero, s
23ea0 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f  ince pFrom is no
23eb0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  t allowed to be 
23ec0 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  a table-valued f
23ed0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
23ee0 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46  ic int cannotBeF
23ef0 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  unction(Parse *p
23f00 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
23f10 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
23f20 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
23f30 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
23f40 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
23f50 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25  rMsg(pParse, "'%
23f60 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63  s' is not a func
23f70 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e  tion", pFrom->zN
23f80 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
23f90 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
23fa0 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   0;.}..#ifndef S
23fb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
23fc0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57  *.** Argument pW
23fd0 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62  ith (which may b
23fe0 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74  e NULL) points t
23ff0 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  o a linked list 
24000 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49  of nested .** WI
24010 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f  TH contexts, fro
24020 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72  m inner to outer
24030 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62  most. If the tab
24040 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
24050 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65   .** FROM clause
24060 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69   element pItem i
24070 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f  s really a commo
24080 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69  n-table-expressi
24090 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65  on (CTE) .** the
240a0 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
240b0 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65  er to the CTE de
240c0 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61  finition for tha
240d0 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69  t table. Otherwi
240e0 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c  se.** return NUL
240f0 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  L..**.** If a no
24100 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20  n-NULL value is 
24110 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70  returned, set *p
24120 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e  pContext to poin
24130 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a  t to the With.**
24140 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65   object that the
24150 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65   returned CTE be
24160 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  longs to..*/.sta
24170 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a  tic struct Cte *
24180 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69  searchWith(.  Wi
24190 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
241b0 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f   Current innermo
241c0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a  st WITH clause *
241d0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
241e0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20  st_item *pItem, 
241f0 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
24200 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65  se element to re
24210 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20  solve */.  With 
24220 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20  **ppContext     
24230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24240 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72  T: WITH clause r
24250 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f  eturn value belo
24260 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63  ngs to */.){.  c
24270 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
24280 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  ;.  if( pItem->z
24290 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28  Database==0 && (
242a0 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a  zName = pItem->z
242b0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
242c0 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72  With *p;.    for
242d0 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70  (p=pWith; p; p=p
242e0 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20  ->pOuter){.     
242f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
24300 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65  r(i=0; i<p->nCte
24310 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
24320 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
24330 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69  mp(zName, p->a[i
24340 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
24350 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74           *ppCont
24360 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
24370 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b     return &p->a[
24380 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
24390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
243a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
243b0 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
243c0 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61  ator maintains a
243d0 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65   stack of active
243e0 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a   WITH clauses.**
243f0 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d   with the inner-
24400 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
24410 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f   being at the to
24420 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
24430 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
24440 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49  ne pushes the WI
24450 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64  TH clause passed
24460 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
24470 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20  rgument.** onto 
24480 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
24490 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e  tack. If argumen
244a0 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c  t bFree is true,
244b0 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49   then this.** WI
244c0 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e  TH clause will n
244d0 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66  ever be popped f
244e0 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49  rom the stack. I
244f0 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
24500 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65  * should be free
24510 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
24520 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49   Parse object. I
24530 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77  n other cases, w
24540 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c  hen.** bFree==0,
24550 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74   the With object
24560 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
24570 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45  long with the SE
24580 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65  LECT .** stateme
24590 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74  nt with which it
245a0 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a   is associated..
245b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57  */.void sqlite3W
245c0 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70  ithPush(Parse *p
245d0 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
245e0 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20  th, u8 bFree){. 
245f0 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d   assert( bFree==
24600 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57  0 || (pParse->pW
24610 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65  ith==0 && pParse
24620 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30  ->pWithToFree==0
24630 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68  ) );.  if( pWith
24640 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24650 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70  pParse->pWith!=p
24660 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74  With );.    pWit
24670 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72  h->pOuter = pPar
24680 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
24690 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
246a0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46  With;.    if( bF
246b0 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57  ree ) pParse->pW
246c0 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74  ithToFree = pWit
246d0 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h;.  }.}../*.** 
246e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  This function ch
246f0 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74  ecks if argument
24700 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f   pFrom refers to
24710 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20   a CTE declared 
24720 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c  by .** a WITH cl
24730 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63  ause on the stac
24740 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e  k currently main
24750 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61  tained by the pa
24760 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66  rser. And,.** if
24770 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65   currently proce
24780 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72  ssing a CTE expr
24790 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73  ession, if it is
247a0 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20   a recursive.** 
247b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
247c0 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a   current CTE..**
247d0 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c  .** If pFrom fal
247e0 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f  ls into either o
247f0 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f  f the two catego
24800 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f  ries above, pFro
24810 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f  m->pTab.** and o
24820 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
24830 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64  populated accord
24840 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ingly. The calle
24850 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a  r should check.*
24860 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  * (pFrom->pTab!=
24870 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  0) to determine 
24880 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
24890 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63   successful matc
248a0 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a  h.** was found..
248b0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
248c0 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20   not a match is 
248d0 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  found, SQLITE_OK
248e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
248f0 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
24900 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rs. If an error 
24910 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65  does occur, an e
24920 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
24930 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a  stored in the.**
24940 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65   parser and some
24950 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
24960 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
24970 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
24980 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70  atic int withExp
24990 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70  and(.  Walker *p
249a0 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63  Walker, .  struc
249b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
249c0 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65  pFrom.){.  Parse
249d0 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
249e0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71  er->pParse;.  sq
249f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
24a00 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74  se->db;.  struct
24a10 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20   Cte *pCte;     
24a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
24a30 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c  ched CTE (or NUL
24a40 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a  L if no match) *
24a50 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b  /.  With *pWith;
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75      /* WITH clau
24a80 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c  se that pCte bel
24a90 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
24aa0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
24ab0 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20  b==0 );..  pCte 
24ac0 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61  = searchWith(pPa
24ad0 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f  rse->pWith, pFro
24ae0 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66  m, &pWith);.  if
24af0 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61  ( pCte ){.    Ta
24b00 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45  ble *pTab;.    E
24b10 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
24b20 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65  .    Select *pSe
24b30 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  l;.    Select *p
24b40 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20  Left;           
24b50 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
24b60 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
24b70 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d  nt */.    int bM
24b80 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20  ayRecursive;    
24b90 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24ba0 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e  if compound join
24bb0 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c  ed by UNION [ALL
24bc0 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70  ] */.    With *p
24bd0 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20  SavedWith;      
24be0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
24bf0 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73  l value of pPars
24c00 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20  e->pWith */..   
24c10 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74   /* If pCte->zCt
24c20 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  eErr is non-NULL
24c30 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
24c40 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20  then this is an 
24c50 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72  illegal.    ** r
24c60 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
24c70 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20  ce to CTE pCte. 
24c80 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  Leave an error i
24c90 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
24ca0 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79  urn.    ** early
24cb0 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  . If pCte->zCteE
24cc0 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  rr is NULL, then
24cd0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   this is not a r
24ce0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
24cf0 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ce..    ** In th
24d00 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64  is case, proceed
24d10 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  .  */.    if( pC
24d20 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20  te->zCteErr ){. 
24d30 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
24d40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74  rMsg(pParse, pCt
24d50 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65  e->zCteErr, pCte
24d60 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
24d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24d80 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
24d90 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  f( cannotBeFunct
24da0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
24db0 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  m) ) return SQLI
24dc0 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61  TE_ERROR;..    a
24dd0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
24de0 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72  ab==0 );.    pFr
24df0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
24e00 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
24e10 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
24e20 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66  (Table));.    if
24e30 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
24e40 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
24e50 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20    pTab->nTabRef 
24e60 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  = 1;.    pTab->z
24e70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
24e80 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d  StrDup(db, pCte-
24e90 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
24ea0 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
24eb0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
24ec0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
24ed0 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
24ee0 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
24ef0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
24f00 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
24f10 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69  eral | TF_NoVisi
24f20 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46  bleRowid;.    pF
24f30 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73  rom->pSelect = s
24f40 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
24f50 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63  db, pCte->pSelec
24f60 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64  t, 0);.    if( d
24f70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24f80 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24f90 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24fa0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
24fb0 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f  Select );..    /
24fc0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
24fd0 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43  is a recursive C
24fe0 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20  TE. */.    pSel 
24ff0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
25000 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73  ;.    bMayRecurs
25010 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70  ive = ( pSel->op
25020 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c  ==TK_ALL || pSel
25030 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
25040 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
25050 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
25060 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72   int i;.      Sr
25070 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46  cList *pSrc = pF
25080 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  rom->pSelect->pS
25090 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  rc;.      for(i=
250a0 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b  0; i<pSrc->nSrc;
250b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
250c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
250d0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
250e0 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  c->a[i];.       
250f0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
25100 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20  abase==0 .      
25110 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61     && pItem->zNa
25120 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  me!=0 .         
25130 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
25140 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d  ICmp(pItem->zNam
25150 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a  e, pCte->zName).
25160 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
25170 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54         pItem->pT
25180 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
25190 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69       pItem->fg.i
251a0 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a  sRecursive = 1;.
251b0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
251c0 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
251d0 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c       pSel->selFl
251e0 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73  ags |= SF_Recurs
251f0 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ive;.        }. 
25200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25210 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65    /* Only one re
25220 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
25230 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
25240 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62  */ .    if( pTab
25250 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20  ->nTabRef>2 ){. 
25260 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
25270 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20  rMsg(.          
25280 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c  pParse, "multipl
25290 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
252a0 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a  recursive table:
252b0 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d   %s", pCte->zNam
252c0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
252d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
252e0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
252f0 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54  assert( pTab->nT
25300 61 62 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53  abRef==1 || ((pS
25310 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f  el->selFlags&SF_
25320 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 54  Recursive) && pT
25330 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29  ab->nTabRef==2 )
25340 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43  );..    pCte->zC
25350 74 65 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61  teErr = "circula
25360 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22  r reference: %s"
25370 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68  ;.    pSavedWith
25380 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   = pParse->pWith
25390 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
253a0 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20  ith = pWith;.   
253b0 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
253c0 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ve ){.      Sele
253d0 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65  ct *pPrior = pSe
253e0 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
253f0 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d   assert( pPrior-
25400 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20  >pWith==0 );.   
25410 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68     pPrior->pWith
25420 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a   = pSel->pWith;.
25430 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
25440 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
25450 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20   pPrior);.      
25460 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20  pPrior->pWith = 
25470 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
25480 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
25490 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
254a0 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
254b0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
254c0 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28  pWith;..    for(
254d0 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
254e0 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
254f0 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
25500 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
25510 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
25520 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
25530 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
25540 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
25550 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
25560 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
25570 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
25580 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
25590 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76 61  ble %s has %d va
255a0 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75  lues for %d colu
255b0 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  mns",.          
255c0 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70    pCte->zName, p
255d0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43  EList->nExpr, pC
255e0 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
255f0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
25600 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
25610 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
25620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
25630 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25640 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73     }.      pELis
25650 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
25660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69  .    }..    sqli
25670 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
25680 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
25690 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
256a0 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
256b0 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
256c0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
256d0 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
256e0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
256f0 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
25700 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d  te->zCteErr = "m
25710 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73 69 76  ultiple recursiv
25720 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73  e references: %s
25730 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
25740 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
25750 74 65 45 72 72 20 3d 20 22 72 65 63 75 72 73 69  teErr = "recursi
25760 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ve reference in 
25770 61 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b  a subquery: %s";
25780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
25790 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
257a0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
257b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d  .    }.    pCte-
257c0 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20  >zCteErr = 0;.  
257d0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
257e0 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
257f0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
25800 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
25810 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25820 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49  OMIT_CTE./*.** I
25830 66 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73  f the SELECT pas
25840 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
25850 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61  d argument has a
25860 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54  n associated WIT
25870 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f  H .** clause, po
25880 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74  p it from the st
25890 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61  ack stored as pa
258a0 72 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20  rt of the Parse 
258b0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
258c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
258d0 73 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65  sed as the xSele
258e0 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61  ctCallback2() ca
258f0 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c  llback by.** sql
25900 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
25910 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20  () when walking 
25920 61 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f  a SELECT tree to
25930 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a   resolve table.*
25940 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65  * names and othe
25950 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  r FROM clause el
25960 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74  ements. .*/.stat
25970 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f  ic void selectPo
25980 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  pWith(Walker *pW
25990 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
259a0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
259b0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
259c0 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72  arse;.  if( pPar
259d0 73 65 2d 3e 70 57 69 74 68 20 26 26 20 70 2d 3e  se->pWith && p->
259e0 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
259f0 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66   With *pWith = f
25a00 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
25a10 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20  >pWith;.    if( 
25a20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20  pWith!=0 ){.    
25a30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
25a40 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29  ->pWith==pWith )
25a50 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
25a60 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70  pWith = pWith->p
25a70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Outer;.    }.  }
25a80 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
25a90 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30   selectPopWith 0
25aa0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
25ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
25ac0 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b   Walker callback
25ad0 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22   for "expanding"
25ae0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
25af0 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69  ent..** "Expandi
25b00 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20  ng" means to do 
25b10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
25b20 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b  *.**    (1)  Mak
25b30 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73  e sure VDBE curs
25b40 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20  or numbers have 
25b50 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
25b60 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20   every.**       
25b70 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65    element of the
25b80 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
25b90 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c  .**    (2)  Fill
25ba0 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74   in the pTabList
25bb0 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64  ->a[].pTab field
25bc0 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  s in the SrcList
25bd0 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20   that .**       
25be0 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63    defines FROM c
25bf0 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65  lause.  When vie
25c00 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ws appear in the
25c10 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a   FROM clause,.**
25c20 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54           fill pT
25c30 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c  abList->a[].pSel
25c40 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20  ect with a copy 
25c50 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
25c60 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20  atement.**      
25c70 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e     that implemen
25c80 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20  ts the view.  A 
25c90 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
25ca0 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43  the view's SELEC
25cb0 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61  T.**         sta
25cc0 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77  tement so that w
25cd0 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64  e can freely mod
25ce0 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68  ify or delete th
25cf0 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  at statement.** 
25d00 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20          without 
25d10 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d  worrying about m
25d20 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65  essing up the pe
25d30 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65  rsistent represe
25d40 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  ntation.**      
25d50 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a     of the view..
25d60 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64  **.**    (3)  Ad
25d70 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57  d terms to the W
25d80 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
25d90 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e  ccommodate the N
25da0 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
25db0 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
25dc0 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
25dd0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
25de0 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
25df0 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
25e00 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
25e10 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
25e20 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
25e30 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
25e40 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
25e50 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
25e60 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
25e70 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
25e80 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
25e90 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
25ea0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
25eb0 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
25ec0 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
25ed0 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
25ee0 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
25ef0 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
25f00 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
25f10 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
25f20 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
25f30 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25f40 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
25f50 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
25f60 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
25f70 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
25f80 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
25f90 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
25fa0 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
25fb0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
25fc0 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45  ->db;.  Expr *pE
25fd0 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70  , *pRight, *pExp
25fe0 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67  r;.  u16 selFlag
25ff0 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b  s = p->selFlags;
26000 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ..  p->selFlags 
26010 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
26020 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
26030 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72  Failed  ){.    r
26040 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26050 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52  .  }.  if( NEVER
26060 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20  (p->pSrc==0) || 
26070 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  (selFlags & SF_E
26080 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20  xpanded)!=0 ){. 
26090 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
260a0 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c  une;.  }.  pTabL
260b0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
260c0 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
260d0 69 73 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57  ist;.  if( p->pW
260e0 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ith ){.    sqlit
260f0 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
26100 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b  e, p->pWith, 0);
26110 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
26120 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
26130 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
26140 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
26150 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
26160 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
26170 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
26180 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
26190 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
261a0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
261b0 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
261c0 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
261d0 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
261e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
261f0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
26200 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
26210 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
26220 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
26230 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
26240 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
26250 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
26260 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
26270 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
26280 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
26290 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
262a0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
262b0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
262c0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
262d0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
262e0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
262f0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e  sert( pFrom->fg.
26300 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
26310 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  | pFrom->pTab!=0
26320 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
26330 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
26340 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
26350 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
26360 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e  >pTab==0 );.#ifn
26370 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26380 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68  CTE.    if( with
26390 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20  Expand(pWalker, 
263a0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
263b0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
263c0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  f( pFrom->pTab )
263d0 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a   {} else.#endif.
263e0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
263f0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
26400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
26410 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
26420 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
26430 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
26440 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
26450 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
26460 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
26470 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
26480 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
26490 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
264a0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
264b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61     if( sqlite3Wa
264c0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
264d0 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e  , pSel) ) return
264e0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
264f0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
26500 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
26510 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
26520 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
26530 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
26540 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26550 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
26560 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
26570 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
26580 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
26590 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f  (db, "sqlite_sq_
265a0 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62  %p", (void*)pTab
265b0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
265c0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20  pSel->pPrior ){ 
265d0 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
265e0 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c  ior; }.      sql
265f0 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
26600 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
26610 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54  pSel->pEList,&pT
26620 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e  ab->nCol,&pTab->
26630 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61  aCol);.      pTa
26640 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
26650 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c       pTab->nRowL
26660 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
26670 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
26680 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
26690 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   );.      pTab->
266a0 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
266b0 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66  phemeral;.#endif
266c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
266d0 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79    /* An ordinary
266e0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
266f0 61 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ame in the FROM 
26700 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
26710 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
26720 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
26730 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
26740 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
26750 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
26760 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20  se, 0, pFrom);. 
26770 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
26780 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26790 6f 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ort;.      if( p
267a0 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78  Tab->nTabRef>=0x
267b0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
267c0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
267d0 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
267e0 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
267f0 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
26800 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
26810 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
26820 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
26830 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
26840 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
26860 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
26870 20 20 20 20 20 69 66 28 20 21 49 73 56 69 72 74       if( !IsVirt
26880 75 61 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e  ual(pTab) && can
26890 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
268a0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a  arse, pFrom) ){.
268b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
268c0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
268d0 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  }.#if !defined(S
268e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
268f0 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
26900 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
26910 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
26920 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
26930 29 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  ) || pTab->pSele
26940 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31  ct ){.        i1
26950 36 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  6 nCol;.        
26960 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
26970 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
26980 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
26990 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
269a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
269b0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
269c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
269d0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
269e0 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
269f0 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
26a00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
26a10 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61  lite3SelectSetNa
26a20 6d 65 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  me(pFrom->pSelec
26a30 74 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  t, pTab->zName);
26a40 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20  .        nCol = 
26a50 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20  pTab->nCol;.    
26a60 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
26a70 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   -1;.        sql
26a80 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
26a90 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
26aa0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
26ab0 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43   pTab->nCol = nC
26ac0 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ol;.      }.#end
26ad0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
26ae0 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
26af0 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
26b00 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
26b10 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
26b20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
26b30 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
26b40 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
26b50 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
26b60 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
26b70 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
26b80 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
26b90 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
26ba0 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
26bb0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
26bc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
26bd0 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
26be0 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
26bf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
26c00 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
26c10 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
26c20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
26c30 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
26c40 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
26c50 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
26c60 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
26c70 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
26c80 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
26c90 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
26ca0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
26cb0 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
26cc0 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
26cd0 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
26ce0 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
26cf0 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70  e TK_ASTERISK op
26d00 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
26d10 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
26d20 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  d in the column.
26d30 20 20 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20    ** list.  The 
26d40 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
26d50 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
26d60 65 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  e the TK_ASTERIS
26d70 4b 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  K.  ** expressio
26d80 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61  ns and expand ea
26d90 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
26da0 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
26db0 73 20 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61  s in.  ** all ta
26dc0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
26dd0 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
26de0 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
26df0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
26e00 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
26e10 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
26e20 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
26e30 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
26e40 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
26e50 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
26e60 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
26e70 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
26e80 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65  K_ASTERISK ) bre
26e90 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
26ea0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
26eb0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
26ec0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
26ed0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
26ee0 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
26ef0 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
26f00 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
26f10 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
26f20 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
26f30 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
26f40 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
26f50 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
26f60 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
26f70 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
26f80 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
26f90 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
26fa0 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
26fb0 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
26fc0 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
26fd0 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
26fe0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
26ff0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
27000 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
27010 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
27020 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
27030 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
27040 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
27050 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
27060 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
27070 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
27080 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
27090 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
270a0 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
270b0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
270c0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
270d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
270e0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
270f0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
27100 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
27110 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
27120 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
27130 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
27140 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
27150 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
27160 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
27170 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
27180 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
27190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
271a0 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
271b0 0a 20 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e  .       && (pE->
271c0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
271d0 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54  ight->op!=TK_AST
271e0 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a  ERISK).      ){.
271f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
27200 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65  particular expre
27210 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ssion does not n
27220 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
27230 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
27240 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
27250 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
27260 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
27270 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20  , a[k].pExpr);. 
27280 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
27290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
272a0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
272b0 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
272c0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
272d0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
272e0 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d  nExpr-1].zSpan =
272f0 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20   a[k].zSpan;.   
27300 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
27310 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
27320 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b   a[k].zSpan = 0;
27330 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27340 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
27350 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
27360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
27370 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
27380 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
27390 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
273a0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
273b0 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
273c0 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
273d0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
273e0 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
273f0 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
27400 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
27410 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
27420 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
27430 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
27440 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
27450 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DOT ){.         
27460 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65   assert( pE->pLe
27470 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ft!=0 );.       
27480 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
27490 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e  HasProperty(pE->
274a0 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c  pLeft, EP_IntVal
274b0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
274c0 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c   zTName = pE->pL
274d0 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
274e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
274f0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
27500 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
27510 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
27520 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
27530 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
27540 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
27550 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  b;.          Sel
27560 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f  ect *pSub = pFro
27570 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
27580 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
27590 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
275a0 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
275b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68  const char *zSch
275c0 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  emaName = 0;.   
275d0 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
275e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
275f0 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  abName==0 ){.   
27600 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
27610 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
27620 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27630 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
27640 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
27650 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
27660 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70  f( pSub==0 || (p
27670 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
27680 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
27690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
276a0 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20   pSub = 0;.     
276b0 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
276c0 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
276d0 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
276e0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
276f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
27700 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
27710 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44  }.            iD
27720 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
27730 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
27740 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
27750 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
27760 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20  Name = iDb>=0 ? 
27770 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
27780 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  SName : "*";.   
27790 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
277a0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
277b0 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
277c0 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
277d0 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
277e0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
277f0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
27800 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
27810 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
27820 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
27830 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
27840 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
27850 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
27860 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
27870 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
27880 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
27890 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
278a0 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
278b0 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
278c0 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
278d0 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
278e0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
278f0 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
27900 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
27910 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
27920 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
27930 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
27940 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
27950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27960 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
27970 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
27980 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
27990 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
279a0 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69  as 'hidden', omi
279b0 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78  t it from the ex
279c0 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
279d0 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
279e0 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65   list unless the
279f0 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20   SELECT has the 
27a00 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
27a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
27a20 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20  bit set..       
27a30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27a40 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46      if( (p->selF
27a50 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64  lags & SF_Includ
27a60 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20  eHidden)==0.    
27a70 20 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69           && IsHi
27a80 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
27a90 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20  ->aCol[j]) .    
27aa0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
27ab0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
27ac0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
27ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62  .            tab
27ae0 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20  leSeen = 1;..   
27af0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
27b00 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
27b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27b20 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f  f( (pFrom->fg.jo
27b30 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
27b40 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
27b50 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
27b60 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
27b70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
27b80 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
27b90 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
27ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
27bb0 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
27bc0 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
27bd0 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
27c00 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
27c10 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
27c20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
27c30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
27c40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
27c50 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
27c60 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
27c70 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c90 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
27ca0 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
27cb0 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
27cc0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
27cd0 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
27ce0 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
27cf0 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
27d00 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
27d10 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
27d30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27d40 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
27d50 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
27d60 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
27d70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
27d80 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
27d90 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
27da0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
27db0 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
27dc0 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
27dd0 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
27de0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
27df0 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
27e00 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
27e10 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
27e20 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
27e30 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
27e40 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
27e50 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
27e60 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27e80 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b  ( zSchemaName ){
27e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27ea0 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
27eb0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
27ec0 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20  zSchemaName);.  
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
27ee0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
27ef0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
27f00 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29  T, pLeft, pExpr)
27f10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27f20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
27f30 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
27f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27f50 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
27f60 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
27f70 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
27f80 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
27f90 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
27fa0 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27fc0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
27fe0 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
27ff0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28000 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
28010 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
28020 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
28030 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
28040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
28050 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61  okenInit(&sColna
28060 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
28070 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28080 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
28090 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
280a0 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
280b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
280c0 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  New && (p->selFl
280d0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
280e0 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
280f0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
28100 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
28110 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65  X = &pNew->a[pNe
28120 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  w->nExpr-1];.   
28130 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
28140 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
28150 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
28160 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
28170 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  up(db, pSub->pEL
28180 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29  ist->a[j].zSpan)
28190 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
281a0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
281b0 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
281c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
281d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
281e0 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
281f0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
28200 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20  "%s.%s.%s",.    
28210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
28240 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43  me, zTabName, zC
28250 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
28260 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
28270 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
28280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
28290 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
282a0 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20   pX->bSpanIsTab 
282b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
282c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
282d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
282e0 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
282f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28300 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
28310 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
28320 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
28330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
28340 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28350 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
28360 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
28370 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
28380 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28390 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
283a0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
283b0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
283c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
283d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
283e0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
283f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
28400 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
28410 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
28420 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
28430 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
28440 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
28450 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
28460 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
28470 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
28480 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
28490 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
284a0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
284b0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
284c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  );.    return WR
284d0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e  C_Abort;.  }.#en
284e0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
284f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
28500 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
28510 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
28520 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
28530 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
28540 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
28550 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
28560 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
28570 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
28580 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
28590 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
285a0 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
285b0 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
285c0 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
285d0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
285e0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
285f0 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
28600 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
28610 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
28620 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
28630 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
28640 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
28650 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
28660 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
28670 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
28680 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
28690 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
286a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
286b0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
286c0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
286d0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
286e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
286f0 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
28700 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
28710 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
28720 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
28730 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
28740 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
28750 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
28760 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
28770 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
28780 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
28790 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
287a0 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
287b0 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
287c0 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
287d0 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
287e0 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
287f0 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
28800 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
28810 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
28820 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
28830 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
28840 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
28850 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
28860 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
28870 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
28880 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
28890 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
288a0 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
288b0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
288c0 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
288d0 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
288e0 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
288f0 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
28900 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
28910 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
28920 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
28930 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
28940 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
28950 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
28960 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
28970 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
28980 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
28990 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
289a0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
289b0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
289c0 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
289d0 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
289e0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
289f0 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
28a00 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
28a10 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ry;.    sqlite3W
28a20 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
28a30 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e  elect);.  }.  w.
28a40 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
28a50 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  = selectExpander
28a60 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
28a70 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50  lback2 = selectP
28a80 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65  opWith;.  sqlite
28a90 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
28aa0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
28ab0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28ac0 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
28ad0 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
28ae0 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
28af0 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
28b00 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
28b10 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
28b20 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
28b30 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
28b40 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
28b50 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
28b60 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
28b70 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
28b80 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
28b90 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
28ba0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
28bb0 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
28bc0 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
28bd0 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
28be0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
28bf0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
28c00 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
28c10 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
28c20 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
28c30 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
28c40 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
28c50 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
28c60 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
28c70 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
28c80 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
28c90 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
28ca0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
28cb0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
28cc0 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
28cd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
28ce0 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53 75 62  oid selectAddSub
28cf0 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61  queryTypeInfo(Wa
28d00 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
28d10 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72  elect *p){.  Par
28d20 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
28d30 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  t i;.  SrcList *
28d40 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75  pTabList;.  stru
28d50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
28d60 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72  *pFrom;..  asser
28d70 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
28d80 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a   SF_Resolved );.
28d90 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
28da0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
28db0 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20  ypeInfo)==0 );. 
28dc0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
28dd0 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a  SF_HasTypeInfo;.
28de0 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
28df0 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54  er->pParse;.  pT
28e00 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
28e10 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72  ;.  for(i=0, pFr
28e20 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
28e30 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
28e40 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
28e50 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
28e60 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
28e70 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
28e80 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  !=0 );.    if( (
28e90 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
28ea0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
28eb0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
28ec0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
28ed0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
28ee0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
28ef0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
28f00 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
28f10 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 20  .      if( pSel 
28f20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
28f30 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
28f40 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
28f50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 71  rior;.        sq
28f60 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
28f70 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
28f80 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
28f90 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  b, pSel);.      
28fa0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  }.    }.  }.}.#e
28fb0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
28fc0 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64  s routine adds d
28fd0 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  atatype and coll
28fe0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
28ff0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a  nformation to.**
29000 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
29010 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f  tures of all FRO
29020 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
29030 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45  ies in a.** SELE
29040 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
29050 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75  .** Use this rou
29060 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20  tine after name 
29070 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73  resolution..*/.s
29080 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
29090 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
290a0 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
290b0 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
290c0 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ct){.#ifndef SQL
290d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
290e0 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  Y.  Walker w;.  
290f0 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
29100 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53  zeof(w));.  w.xS
29110 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
29120 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
29130 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e  ryTypeInfo;.  w.
29140 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
29150 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
29160 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
29170 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  = pParse;.  sqli
29180 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
29190 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
291a0 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
291b0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
291c0 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
291d0 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
291e0 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
291f0 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
29200 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
29210 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
29220 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
29230 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
29240 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
29250 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
29260 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
29270 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
29280 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
29290 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
292a0 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
292b0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
292c0 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
292d0 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
292e0 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
292f0 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
29300 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
29310 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
29320 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
29330 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
29340 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
29350 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
29360 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29370 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
29380 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
29390 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
293a0 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
293b0 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
293c0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
293d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
293e0 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
293f0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
29400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29410 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
29420 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
29430 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
29440 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
29450 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
29460 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
29470 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
29480 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
29490 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
294a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
294b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
294c0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
294d0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
294e0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
294f0 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
29500 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
29510 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
29520 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
29530 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
29540 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
29550 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
29560 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
29570 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
29580 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
29590 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
295a0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
295b0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
295c0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
295d0 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
295e0 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
295f0 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
29600 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
29610 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
29620 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
29630 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
29640 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
29650 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
29660 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
29670 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
29680 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
29690 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
296a0 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
296b0 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
296c0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
296d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
296e0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
296f0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
29700 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
29710 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
29720 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
29730 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
29740 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
29750 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
29760 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
29770 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
29780 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
29790 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
297a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
297b0 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
297c0 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
297d0 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
297e0 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
297f0 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
29800 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
29810 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
29820 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
29830 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
29840 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
29850 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
29860 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
29870 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
29880 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
29890 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
298a0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
298b0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
298c0 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
298d0 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
298e0 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
298f0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
29900 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
29910 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
29920 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
29930 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
29940 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
29950 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
29960 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
29970 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
29980 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
29990 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
299a0 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
299b0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
299c0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
299d0 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
299e0 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
299f0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
29a00 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
29a10 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
29a20 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
29a30 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
29a40 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
29a50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
29a60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29a70 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
29a80 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
29a90 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
29aa0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
29ab0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
29ac0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
29ad0 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
29ae0 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
29af0 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
29b00 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
29b10 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
29b20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
29b30 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
29b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29b50 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
29b60 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
29b70 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
29b80 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20  e, pE->x.pList, 
29b90 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
29ba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
29bb0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
29bc0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
29bd0 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bf0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
29c00 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
29c10 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NFO);.      }.  
29c20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
29c30 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41   Invoke the OP_A
29c40 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64  ggFinalize opcod
29c50 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72  e for every aggr
29c60 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  egate function.*
29c70 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f  * in the AggInfo
29c80 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
29c90 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c  tatic void final
29ca0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
29cb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
29cc0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
29cd0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
29ce0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
29cf0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
29d00 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
29d10 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
29d20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
29d30 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
29d40 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
29d50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
29d60 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d  ist = pF->pExpr-
29d70 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73  >x.pList;.    as
29d80 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
29d90 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72  operty(pF->pExpr
29da0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
29db0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
29dc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
29dd0 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65  ggFinal, pF->iMe
29de0 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74  m, pList ? pList
29df0 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20  ->nExpr : 0);.  
29e00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
29e10 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
29e20 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
29e30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70  .  }.}../*.** Up
29e40 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c  date the accumul
29e50 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ator memory cell
29e60 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61  s for an aggrega
29e70 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  te based on.** t
29e80 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
29e90 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73  r position..*/.s
29ea0 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61 74  tatic void updat
29eb0 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  eAccumulator(Par
29ec0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
29ed0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
29ee0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
29ef0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
29f00 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
29f10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
29f20 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
29f30 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
29f40 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
29f50 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
29f60 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
29f70 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
29f80 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
29f90 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
29fa0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
29fb0 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
29fc0 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
29fd0 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
29fe0 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
29ff0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2a000 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
2a010 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
2a020 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2a030 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
2a040 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2a050 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
2a060 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
2a070 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
2a080 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
2a090 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2a0a0 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
2a0b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2a0c0 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2a0d0 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
2a0e0 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
2a0f0 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
2a100 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
2a110 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
2a120 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
2a130 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
2a140 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
2a150 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
2a160 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2a170 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
2a180 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20  ase( nArg==0 ); 
2a190 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74   /* Error condit
2a1a0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ion */.      tes
2a1b0 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b  tcase( nArg>1 );
2a1c0 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72     /* Also an er
2a1d0 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64  ror */.      cod
2a1e0 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
2a1f0 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
2a200 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
2a210 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
2a220 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
2a230 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
2a240 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
2a250 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
2a260 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
2a270 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2a280 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2a290 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2a2a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
2a2b0 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
2a2c0 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
2a2d0 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
2a2e0 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
2a2f0 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
2a300 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
2a310 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
2a320 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2a330 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2a340 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
2a350 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2a360 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
2a370 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
2a380 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2a390 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2a3a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a3b0 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
2a3c0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2a3d0 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
2a3e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a3f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a400 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
2a410 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
2a420 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
2a430 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
2a440 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a450 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2a460 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20  OP_AggStep0, 0, 
2a470 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
2a480 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2a490 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
2a4a0 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
2a4b0 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
2a4c0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2a4d0 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
2a4e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2a4f0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
2a500 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
2a510 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
2a520 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2a530 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
2a540 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
2a550 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
2a560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2a570 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2a580 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
2a590 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2a5a0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2a5b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
2a5c0 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  fore populating 
2a5d0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2a5e0 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72  registers, clear
2a5f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2a600 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  e..  ** Otherwis
2a610 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  e, if any of the
2a620 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
2a630 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65   values are alre
2a640 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a  ady present .  *
2a650 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20  * in registers, 
2a660 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2a670 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f  ) may use OP_SCo
2a680 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76  py to copy the v
2a690 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d  alue.  ** to pC-
2a6a0 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68  >iMem. But by th
2a6b0 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65  e time the value
2a6c0 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72   is used, the or
2a6d0 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a  iginal register.
2a6e0 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65    ** may have be
2a6f0 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64  en used, invalid
2a700 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c  ating the underl
2a710 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64  ying buffer hold
2a720 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78  ing the.  ** tex
2a730 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e  t or blob value.
2a740 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33   See ticket [883
2a750 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20  034dcb5]..  **. 
2a760 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75   ** Another solu
2a770 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f  tion would be to
2a780 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53   change the OP_S
2a790 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70  Copy used to cop
2a7a0 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61  y cached.  ** va
2a7b0 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f  lues to an OP_Co
2a7c0 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  py..  */.  if( r
2a7d0 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64  egHit ){.    add
2a7e0 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74  rHitTest = sqlit
2a7f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2a800 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20  OP_If, regHit); 
2a810 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2a820 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
2a830 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2a840 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  rse);.  for(i=0,
2a850 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43   pC=pAggInfo->aC
2a860 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  ol; i<pAggInfo->
2a870 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b  nAccumulator; i+
2a880 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71  +, pC++){.    sq
2a890 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
2a8a0 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c  arse, pC->pExpr,
2a8b0 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a   pC->iMem);.  }.
2a8c0 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2a8d0 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71  ctMode = 0;.  sq
2a8e0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2a8f0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69  ear(pParse);.  i
2a900 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20 29  f( addrHitTest )
2a910 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2a920 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2a930 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d  rHitTest);.  }.}
2a940 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69  ../*.** Add a si
2a950 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20  ngle OP_Explain 
2a960 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74  instruction to t
2a970 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61  he VDBE to expla
2a980 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63  in a simple.** c
2a990 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22  ount(*) query ("
2a9a0 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2a9b0 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a  FROM pTab")..*/.
2a9c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a9d0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74  MIT_EXPLAIN.stat
2a9e0 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53  ic void explainS
2a9f0 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61  impleCount(.  Pa
2aa00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aa20 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
2aa30 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa50 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69      /* Table bei
2aa60 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20  ng queried */.  
2aa70 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa90 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f  /* Index used to
2aaa0 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20   optimize scan, 
2aab0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  or NULL */.){.  
2aac0 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
2aad0 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e  ain==2 ){.    in
2aae0 74 20 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78  t bCover = (pIdx
2aaf0 21 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64  !=0 && (HasRowid
2ab00 28 70 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69  (pTab) || !IsPri
2ab10 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64  maryKeyIndex(pId
2ab20 78 29 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  x)));.    char *
2ab30 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50  zEqp = sqlite3MP
2ab40 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
2ab50 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73  , "SCAN TABLE %s
2ab60 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  %s%s",.        p
2ab70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
2ab80 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55      bCover ? " U
2ab90 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e  SING COVERING IN
2aba0 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20  DEX " : "",.    
2abb0 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64      bCover ? pId
2abc0 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20  x->zName : "".  
2abd0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
2abe0 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
2abf0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62      pParse->pVdb
2ac00 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  e, OP_Explain, p
2ac10 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2ac20 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34  , 0, 0, zEqp, P4
2ac30 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a  _DYNAMIC.    );.
2ac40 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
2ac50 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70  fine explainSimp
2ac60 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23  leCount(a,b,c).#
2ac70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
2ac80 74 65 78 74 20 6f 62 6a 65 63 74 20 66 6f 72 20  text object for 
2ac90 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70  havingToWhereExp
2aca0 72 43 62 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74  rCb()..*/.struct
2acb0 20 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74   HavingToWhereCt
2acc0 78 20 7b 0a 20 20 45 78 70 72 20 2a 2a 70 70 57  x {.  Expr **ppW
2acd0 68 65 72 65 3b 0a 20 20 45 78 70 72 4c 69 73 74  here;.  ExprList
2ace0 20 2a 70 47 72 6f 75 70 42 79 3b 0a 7d 3b 0a 0a   *pGroupBy;.};..
2acf0 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c  /*.** sqlite3Wal
2ad00 6b 45 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b  kExpr() callback
2ad10 20 75 73 65 64 20 62 79 20 68 61 76 69 6e 67 54   used by havingT
2ad20 6f 57 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  oWhere()..**.** 
2ad30 49 66 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73  If the node pass
2ad40 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  ed to the callba
2ad50 63 6b 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e  ck is a TK_AND n
2ad60 6f 64 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ode, return .** 
2ad70 57 52 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20  WRC_Continue to 
2ad80 74 65 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b  tell sqlite3Walk
2ad90 45 78 70 72 28 29 20 74 6f 20 69 74 65 72 61 74  Expr() to iterat
2ada0 65 20 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20  e through child 
2adb0 6e 6f 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  nodes..**.** Oth
2adc0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57  erwise, return W
2add0 52 43 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69  RC_Prune. In thi
2ade0 73 20 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65  s case, also che
2adf0 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75  ck if the .** su
2ae00 62 2d 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74  b-expression mat
2ae10 63 68 65 73 20 74 68 65 20 63 72 69 74 65 72 69  ches the criteri
2ae20 61 20 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65  a for being move
2ae30 64 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a  d to the WHERE.*
2ae40 2a 20 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c  * clause. If so,
2ae50 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 57   add it to the W
2ae60 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20  HERE clause and 
2ae70 72 65 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d  replace the sub-
2ae80 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69  expression.** wi
2ae90 74 68 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20  thin the HAVING 
2aea0 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
2aeb0 61 20 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a  a constant "1"..
2aec0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2aed0 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
2aee0 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  b(Walker *pWalke
2aef0 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
2af00 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
2af10 21 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  !=TK_AND ){.    
2af20 73 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57  struct HavingToW
2af30 68 65 72 65 43 74 78 20 2a 70 20 3d 20 70 57 61  hereCtx *p = pWa
2af40 6c 6b 65 72 2d 3e 75 2e 70 48 61 76 69 6e 67 43  lker->u.pHavingC
2af50 74 78 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  tx;.    if( sqli
2af60 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
2af70 74 4f 72 47 72 6f 75 70 42 79 28 70 57 61 6c 6b  tOrGroupBy(pWalk
2af80 65 72 2d 3e 70 50 61 72 73 65 2c 20 70 45 78 70  er->pParse, pExp
2af90 72 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 20  r, p->pGroupBy) 
2afa0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2afb0 20 2a 64 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e   *db = pWalker->
2afc0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
2afd0 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
2afe0 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
2aff0 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
2b000 26 73 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e  &sqlite3IntToken
2b010 73 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  s[1], 0);.      
2b020 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
2b030 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72 65      Expr *pWhere
2b040 20 3d 20 2a 28 70 2d 3e 70 70 57 68 65 72 65 29   = *(p->ppWhere)
2b050 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 45  ;.        SWAP(E
2b060 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78  xpr, *pNew, *pEx
2b070 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  pr);.        pNe
2b080 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  w = sqlite3ExprA
2b090 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20 70  nd(db, pWhere, p
2b0a0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 2a 28  New);.        *(
2b0b0 70 2d 3e 70 70 57 68 65 72 65 29 20 3d 20 70 4e  p->ppWhere) = pN
2b0c0 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
2b0d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  }.    return WRC
2b0e0 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65  _Prune;.  }.  re
2b0f0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2b100 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  e;.}../*.** Tran
2b110 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74 65  sfer eligible te
2b120 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41 56  rms from the HAV
2b130 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
2b140 71 75 65 72 79 2c 20 77 68 69 63 68 20 69 73 0a  query, which is.
2b150 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66 74  ** processed aft
2b160 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20  er grouping, to 
2b170 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2b180 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f 63 65  , which is proce
2b190 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67  ssed before.** g
2b1a0 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78 61  rouping. For exa
2b1b0 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a  mple, the query:
2b1c0 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
2b1d0 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20  * FROM <tables> 
2b1e0 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50 20  WHERE a=? GROUP 
2b1f0 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f 20  BY b HAVING b=? 
2b200 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61  AND c=?.**.** ca
2b210 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61  n be rewritten a
2b220 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  s:.**.**   SELEC
2b230 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73  T * FROM <tables
2b240 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  > WHERE a=? AND 
2b250 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48  b=? GROUP BY b H
2b260 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20  AVING c=?.**.** 
2b270 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41  A term of the HA
2b280 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20  VING expression 
2b290 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20  is eligible for 
2b2a0 74 72 61 6e 73 66 65 72 20 69 66 20 69 74 20 63  transfer if it c
2b2b0 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72  onsists.** entir
2b2c0 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73  ely of constants
2b2d0 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 73   and expressions
2b2e0 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 47   that are also G
2b2f0 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74 68  ROUP BY terms th
2b300 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22 42  at.** use the "B
2b310 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e  INARY" collation
2b320 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74   sequence..*/.st
2b330 61 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e 67  atic void having
2b340 54 6f 57 68 65 72 65 28 0a 20 20 50 61 72 73 65  ToWhere(.  Parse
2b350 20 2a 70 50 61 72 73 65 2c 0a 20 20 45 78 70 72   *pParse,.  Expr
2b360 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 0a  List *pGroupBy,.
2b370 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c    Expr *pHaving,
2b380 20 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65   .  Expr **ppWhe
2b390 72 65 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 48  re.){.  struct H
2b3a0 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20  avingToWhereCtx 
2b3b0 73 43 74 78 3b 0a 20 20 57 61 6c 6b 65 72 20 73  sCtx;.  Walker s
2b3c0 57 61 6c 6b 65 72 3b 0a 0a 20 20 73 43 74 78 2e  Walker;..  sCtx.
2b3d0 70 70 57 68 65 72 65 20 3d 20 70 70 57 68 65 72  ppWhere = ppWher
2b3e0 65 3b 0a 20 20 73 43 74 78 2e 70 47 72 6f 75 70  e;.  sCtx.pGroup
2b3f0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 0a  By = pGroupBy;..
2b400 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65    memset(&sWalke
2b410 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57 61  r, 0, sizeof(sWa
2b420 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65  lker));.  sWalke
2b430 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  r.pParse = pPars
2b440 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78  e;.  sWalker.xEx
2b450 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76  prCallback = hav
2b460 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62  ingToWhereExprCb
2b470 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 48  ;.  sWalker.u.pH
2b480 61 76 69 6e 67 43 74 78 20 3d 20 26 73 43 74 78  avingCtx = &sCtx
2b490 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2b4a0 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 48  xpr(&sWalker, pH
2b4b0 61 76 69 6e 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  aving);.}../*.**
2b4c0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2b4d0 20 74 68 65 20 70 54 68 69 73 20 65 6e 74 72 79   the pThis entry
2b4e0 20 6f 66 20 70 54 61 62 4c 69 73 74 20 69 73 20   of pTabList is 
2b4f0 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61  a self-join of a
2b500 20 70 72 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20   prior view..** 
2b510 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 72  If it is, then r
2b520 65 74 75 72 6e 20 74 68 65 20 53 72 63 4c 69 73  eturn the SrcLis
2b530 74 5f 69 74 65 6d 20 66 6f 72 20 74 68 65 20 70  t_item for the p
2b540 72 69 6f 72 20 76 69 65 77 2e 20 20 49 66 20 69  rior view.  If i
2b550 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65  t is not,.** the
2b560 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73  n return 0..*/.s
2b570 74 61 74 69 63 20 73 74 72 75 63 74 20 53 72 63  tatic struct Src
2b580 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c  List_item *isSel
2b590 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20 53 72 63  fJoinView(.  Src
2b5a0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
2b5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2b5c0 72 63 68 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69  rch for self-joi
2b5d0 6e 73 20 69 6e 20 74 68 69 73 20 46 52 4f 4d 20  ns in this FROM 
2b5e0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
2b5f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2b600 2a 70 54 68 69 73 20 20 20 2f 2a 20 53 65 61 72  *pThis   /* Sear
2b610 63 68 20 66 6f 72 20 70 72 69 6f 72 20 72 65 66  ch for prior ref
2b620 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 73  erence to this s
2b630 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  ubquery */.){.  
2b640 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2b650 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f  tem *pItem;.  fo
2b660 72 28 70 49 74 65 6d 20 3d 20 70 54 61 62 4c 69  r(pItem = pTabLi
2b670 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68  st->a; pItem<pTh
2b680 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  is; pItem++){.  
2b690 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2b6a0 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  lect==0 ) contin
2b6b0 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
2b6c0 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2b6d0 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
2b6e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
2b6f0 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
2b700 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
2b710 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
2b720 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20 70 54 68  ->zDatabase, pTh
2b730 69 73 2d 3e 7a 44 61 74 61 62 61 73 65 29 21 3d  is->zDatabase)!=
2b740 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2b750 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2b760 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  ricmp(pItem->zNa
2b770 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65  me, pThis->zName
2b780 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2b790 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2b7a0 45 78 70 72 43 6f 6d 70 61 72 65 28 70 54 68 69  ExprCompare(pThi
2b7b0 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65  s->pSelect->pWhe
2b7c0 72 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  re, pItem->pSele
2b7d0 63 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29 20  ct->pWhere, -1) 
2b7e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2b7f0 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65  view was modifie
2b800 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20  d by some other 
2b810 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63  optimization suc
2b820 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75  h as.      ** pu
2b830 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
2b840 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  () */.      cont
2b850 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
2b860 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20  return pItem;.  
2b870 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2b880 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2b890 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
2b8a0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
2b8b0 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
2b8c0 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
2b8d0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
2b8e0 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
2b8f0 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
2b900 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
2b910 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
2b920 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
2b930 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
2b940 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
2b950 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2b960 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2b970 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
2b980 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
2b990 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
2b9a0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
2b9b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2b9c0 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
2b9d0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
2b9e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2b9f0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
2ba00 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
2ba10 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
2ba20 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
2ba30 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
2ba40 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
2ba50 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
2ba60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2ba70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2ba80 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2ba90 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2baa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2bab0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2bac0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
2bad0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
2bae0 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
2baf0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
2bb00 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
2bb10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb30 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2bb40 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
2bb50 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
2bb60 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
2bb70 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
2bb80 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
2bb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2bba0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
2bbb0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
2bbc0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
2bbd0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
2bbe0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
2bbf0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
2bc00 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
2bc10 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
2bc20 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
2bc30 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
2bc40 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
2bc50 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
2bc60 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
2bc70 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
2bc80 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2bc90 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
2bca0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2bcb0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2bcc0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
2bcd0 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
2bce0 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
2bcf0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2bd00 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
2bd10 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
2bd20 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2bd30 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2bd40 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
2bd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2bd60 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
2bd70 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
2bd80 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
2bd90 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
2bda0 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2bdb0 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
2bdc0 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
2bdd0 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
2bde0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
2bdf0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2be00 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2be10 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
2be20 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
2be30 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
2be40 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
2be50 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
2be60 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
2be70 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
2be80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
2be90 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
2bea0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2beb0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2bec0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23  connection */..#
2bed0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2bee0 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
2bef0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
2bf00 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  d = pParse->iSel
2bf10 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d  ectId;.  pParse-
2bf20 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61  >iSelectId = pPa
2bf30 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2bf40 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Id++;.#endif..  
2bf50 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2bf60 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64  .  if( p==0 || d
2bf70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2bf80 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
2bf90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
2bfa0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2bfb0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2bfc0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
2bfd0 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  T, 0, 0, 0) ) re
2bfe0 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74  turn 1;.  memset
2bff0 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73  (&sAggInfo, 0, s
2c000 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29  izeof(sAggInfo))
2c010 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2c020 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 50 61 72  E_ENABLED.  pPar
2c030 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
2c040 74 2b 2b 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  t++;.  SELECTTRA
2c050 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
2c060 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
2c070 67 3a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 73  g:\n"));.  if( s
2c080 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2c090 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2c0a0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2c0b0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2c0c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
2c0d0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2c0e0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2c0f0 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46  eDest!=SRT_DistF
2c100 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2c110 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2c120 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2c130 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61  =SRT_Fifo );.  a
2c140 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2c150 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2c160 65 44 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51  eDest!=SRT_DistQ
2c170 75 65 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ueue );.  assert
2c180 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
2c190 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2c1a0 21 3d 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20  !=SRT_Queue );. 
2c1b0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
2c1c0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
2c1d0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
2c1e0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
2c1f0 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
2c200 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
2c210 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
2c220 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2c230 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
2c240 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
2c250 61 72 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ard ||.         
2c260 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2c270 53 52 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44  SRT_Queue  || pD
2c280 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2c290 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20  DistFifo ||.    
2c2a0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
2c2b0 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65  est==SRT_DistQue
2c2c0 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ue || pDest->eDe
2c2d0 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20  st==SRT_Fifo);. 
2c2e0 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42     /* If ORDER B
2c2f0 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65  Y makes no diffe
2c300 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74  rence in the out
2c310 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72  put then neither
2c320 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53   does.    ** DIS
2c330 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20  TINCT so it can 
2c340 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20  be removed too. 
2c350 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
2c360 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
2c370 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
2c380 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
2c390 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   0;.    p->selFl
2c3a0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
2c3b0 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
2c3c0 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
2c3d0 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65  rse, p, 0);.  me
2c3e0 6d 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20  mset(&sSort, 0, 
2c3f0 73 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a  sizeof(sSort));.
2c400 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2c410 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2c420 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2c430 70 53 72 63 3b 0a 20 20 69 66 28 20 70 50 61 72  pSrc;.  if( pPar
2c440 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
2c450 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2c460 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2c470 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  end;.  }.  asser
2c480 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
2c490 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d  );.  isAgg = (p-
2c4a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2c4b0 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69  ggregate)!=0;.#i
2c4c0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2c4d0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2c4e0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2c4f0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45   0x100 ){.    SE
2c500 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c  LECTTRACE(0x100,
2c510 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65  pParse,p, ("afte
2c520 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  r name resolutio
2c530 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  n:\n"));.    sql
2c540 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2c550 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
2c560 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 54 72  .#endif..  /* Tr
2c570 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  y to flatten sub
2c580 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
2c590 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e  ROM clause up in
2c5a0 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72  to the main quer
2c5b0 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  y.  */.#if !defi
2c5c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2c5d0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
2c5e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2c5f0 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d  T_VIEW).  for(i=
2c600 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26  0; !p->pPrior &&
2c610 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2c620 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2c630 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2c640 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2c650 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2c660 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
2c670 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
2c680 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
2c690 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
2c6a0 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
2c6b0 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
2c6c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
2c6d0 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63  /* Catch mismatc
2c6e0 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65  h in the declare
2c6f0 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76  d columns of a v
2c700 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  iew and the numb
2c710 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c  er of.    ** col
2c720 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  umns in the SELE
2c730 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f  CT on the RHS */
2c740 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
2c750 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73  Col!=pSub->pELis
2c760 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
2c770 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2c780 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65 63  g(pParse, "expec
2c790 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66  ted %d columns f
2c7a0 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74 20  or '%s' but got 
2c7b0 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
2c7c0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
2c7d0 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61  >nCol, pTab->zNa
2c7e0 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  me, pSub->pEList
2c7f0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
2c800 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
2c810 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73 41 67  .    }..    isAg
2c820 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73 65  gSub = (pSub->se
2c830 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2c840 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20 69  egate)!=0;.    i
2c850 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65  f( flattenSubque
2c860 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c  ry(pParse, p, i,
2c870 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75 62   isAgg, isAggSub
2c880 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
2c890 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
2c8a0 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
2c8b0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
2c8c0 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67 53        if( isAggS
2c8d0 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ub ){.        is
2c8e0 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
2c8f0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2c900 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
2c910 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20      }.      i = 
2c920 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  -1;.    }.    pT
2c930 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
2c940 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
2c950 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2c960 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2c970 20 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65    if( !Ignorable
2c980 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29  Orderby(pDest) )
2c990 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  {.      sSort.pO
2c9a0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2c9b0 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erBy;.    }.  }.
2c9c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74  #endif..  /* Get
2c9d0 20 61 20 70 6f 69 6e 74 65 72 20 74 68 65 20 56   a pointer the V
2c9e0 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  DBE under constr
2c9f0 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69  uction, allocati
2ca00 6e 67 20 61 20 6e 65 77 20 56 44 42 45 20 69 66  ng a new VDBE if
2ca10 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e   one.  ** does n
2ca20 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
2ca30 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
2ca40 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
2ca50 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
2ca60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2ca70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ca80 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
2ca90 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65  LECT.  /* Handle
2caa0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
2cab0 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e   statements usin
2cac0 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20 6d  g the separate m
2cad0 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a  ultiSelect().  *
2cae0 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a  * procedure..  *
2caf0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
2cb00 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75  r ){.    rc = mu
2cb10 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73 65  ltiSelect(pParse
2cb20 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20  , p, pDest);.   
2cb30 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
2cb40 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  er(pParse->iSele
2cb50 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65  ctId, iRestoreSe
2cb60 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53 45 4c  lectId);.#if SEL
2cb70 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2cb80 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2cb90 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  (1,pParse,p,("en
2cba0 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  d compound-selec
2cbb0 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  t processing\n")
2cbc0 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  );.    pParse->n
2cbd0 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a  SelectIndent--;.
2cbe0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
2cbf0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
2cc00 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20  ..  /* For each 
2cc10 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d  term in the FROM
2cc20 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20   clause, do two 
2cc30 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29  things:.  ** (1)
2cc40 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65   Authorized unre
2cc50 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a  ferenced tables.
2cc60 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74    ** (2) Generat
2cc70 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73  e code for all s
2cc80 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a  ub-queries.  */.
2cc90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
2cca0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2ccb0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
2ccc0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2ccd0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2cce0 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
2ccf0 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
2cd00 6c 65 63 74 20 2a 70 53 75 62 3b 0a 0a 20 20 20  lect *pSub;..   
2cd10 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54 45   /* Issue SQLITE
2cd20 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74  _READ authorizat
2cd30 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b 65  ions with a fake
2cd40 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72   column name for
2cd50 20 61 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   any tables that
2cd60 0a 20 20 20 20 2a 2a 20 61 72 65 20 72 65 66 65  .    ** are refe
2cd70 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d 20  renced but from 
2cd80 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73 20  which no values 
2cd90 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 20 45  are extracted. E
2cda0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65  xamples of where
2cdb0 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6b 69   these.    ** ki
2cdc0 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49  nds of null SQLI
2cdd0 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
2cde0 61 74 69 6f 6e 73 20 77 6f 75 6c 64 20 6f 63 63  ations would occ
2cdf0 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ur:.    **.    *
2ce00 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  *     SELECT cou
2ce10 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20  nt(*) FROM t1;  
2ce20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
2ce30 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20  t1."".    **    
2ce40 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f   SELECT t1.* FRO
2ce50 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53  M t1, t2;   -- S
2ce60 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22  QLITE_READ t2.""
2ce70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2ce80 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
2ce90 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ame is an empty 
2cea0 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70  string.  It is p
2ceb0 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61  ossible for a ta
2cec0 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61  ble to.    ** ha
2ced0 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ve a column name
2cee0 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73  d by the empty s
2cef0 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20  tring, in which 
2cf00 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
2cf10 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64   way to.    ** d
2cf20 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65  istinguish betwe
2cf30 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63  en an unreferenc
2cf40 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20  ed table and an 
2cf50 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65  actual reference
2cf60 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22   to the.    ** "
2cf70 22 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6f  " column.  The o
2cf80 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77  riginal design w
2cf90 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20  as for the fake 
2cfa0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62  column name to b
2cfb0 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a  e a NULL,.    **
2cfc0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   which would be 
2cfd0 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75  unambiguous.  Bu
2cfe0 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69  t legacy authori
2cff0 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73  zation callbacks
2d000 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73   might.    ** as
2d010 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sume the column 
2d020 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  name is non-NULL
2d030 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20   and segfault.  
2d040 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d  The use of an em
2d050 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20 20 2a  pty string.    *
2d060 2a 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63  * for the fake c
2d070 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73  olumn name seems
2d080 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20   safer..    */. 
2d090 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f     if( pItem->co
2d0a0 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lUsed==0 ){.    
2d0b0 20 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65    sqlite3AuthChe
2d0c0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
2d0d0 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a  E_READ, pItem->z
2d0e0 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d  Name, "", pItem-
2d0f0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
2d100 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
2d110 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
2d120 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
2d130 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
2d140 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65  IEW).    /* Gene
2d150 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
2d160 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
2d170 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2d180 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62  .    */.    pSub
2d190 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
2d1a0 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  t;.    if( pSub=
2d1b0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
2d1c0 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73      /* Sometimes
2d1d0 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
2d1e0 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65  subquery will be
2d1f0 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20   generated more 
2d200 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65  than.    ** once
2d210 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  , if the subquer
2d220 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  y is part of the
2d230 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2d240 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20   a LEFT JOIN,.  
2d250 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65    ** for example
2d260 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
2d270 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61   do not regenera
2d280 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d  te the code to m
2d290 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61  anifest.    ** a
2d2a0 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d   view or the co-
2d2b0 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65  routine to imple
2d2c0 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68  ment a view.  Th
2d2d0 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
2d2e0 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69  .    ** is suffi
2d2f0 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68  cient, though th
2d300 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
2d310 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65  manifest the vie
2d320 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20  w does need.    
2d330 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ** to be invoked
2d340 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
2d350 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
2d360 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69  llSub ){.      i
2d370 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
2d380 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a  Coroutine==0 ){.
2d390 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2d3a0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  ubroutine that m
2d3b0 61 6e 69 66 65 73 74 73 20 74 68 65 20 76 69 65  anifests the vie
2d3c0 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e 65  w might be a one
2d3d0 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20  -time routine,. 
2d3e0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74 20         ** or it 
2d3f0 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
2d400 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20 69   rerun on each i
2d410 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73 65  teration because
2d420 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   it.        ** e
2d430 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c 61  ncodes a correla
2d440 74 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f  ted subquery. */
2d450 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2d460 65 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  e( sqlite3VdbeGe
2d470 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64  tOp(v, pItem->ad
2d480 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f  drFillSub)->opco
2d490 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20  de==OP_Once );. 
2d4a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d4b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2d4c0 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67  osub, pItem->reg
2d4d0 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61  Return, pItem->a
2d4e0 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20  ddrFillSub);.   
2d4f0 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69     }.      conti
2d500 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
2d510 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
2d520 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
2d530 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
2d540 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
2d550 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
2d560 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68  eferred to by th
2d570 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
2d580 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
2d590 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
2d5a0 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
2d5b0 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
2d5c0 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
2d5d0 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
2d5e0 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
2d5f0 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
2d600 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
2d610 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
2d620 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
2d630 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
2d640 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
2d650 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
2d660 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
2d670 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
2d680 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
2d690 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
2d6a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  );..    /* Make 
2d6b0 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61  copies of consta
2d6c0 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20  nt WHERE-clause 
2d6d0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74  terms in the out
2d6e0 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20  er query down.  
2d6f0 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20    ** inside the 
2d700 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20  subquery.  This 
2d710 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62  can help the sub
2d720 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72  query to run mor
2d730 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20  e efficiently.. 
2d740 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
2d750 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
2d760 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30  e & JT_OUTER)==0
2d770 0a 20 20 20 20 20 26 26 20 70 75 73 68 44 6f 77  .     && pushDow
2d780 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72  nWhereTerms(pPar
2d790 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68  se, pSub, p->pWh
2d7a0 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  ere, pItem->iCur
2d7b0 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69 66 20  sor).    ){.#if 
2d7c0 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2d7d0 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73 71  LED.      if( sq
2d7e0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2d7f0 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
2d800 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2d810 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
2d820 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61  "After WHERE-cla
2d830 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e  use push-down:\n
2d840 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  "));.        sql
2d850 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2d860 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
2d870 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2d880 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  }..    /* Genera
2d890 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  te code to imple
2d8a0 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72  ment the subquer
2d8b0 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  y.    **.    ** 
2d8c0 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
2d8d0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
2d8e0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 61   co-routine if a
2d8f0 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
2d900 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20 20 20 28  true:.    **   (
2d910 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
2d920 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2d930 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c  o be the outer l
2d940 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69 74 0a  oop (so that it.
2d950 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 64 6f      **        do
2d960 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2d970 65 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20  e computed more 
2d980 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a  than once).    *
2d990 2a 20 20 20 28 32 29 20 20 54 68 65 20 41 4c 4c  *   (2)  The ALL
2d9a0 20 6b 65 79 77 6f 72 64 20 61 66 74 65 72 20 53   keyword after S
2d9b0 45 4c 45 43 54 20 69 73 20 6f 6d 69 74 74 65 64  ELECT is omitted
2d9c0 2e 20 20 28 41 70 70 6c 69 63 61 74 69 6f 6e 73  .  (Applications
2d9d0 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20   are.    **     
2d9e0 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20 73 61     allowed to sa
2d9f0 79 20 22 53 45 4c 45 43 54 20 41 4c 4c 22 20 69  y "SELECT ALL" i
2da00 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74 20 22  nstead of just "
2da10 53 45 4c 45 43 54 22 20 74 6f 20 64 69 73 61 62  SELECT" to disab
2da20 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  le.    **       
2da30 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 2d 72   the use of co-r
2da40 6f 75 74 69 6e 65 73 2e 29 0a 20 20 20 20 2a 2a  outines.).    **
2da50 20 20 20 28 33 29 20 20 43 6f 2d 72 6f 75 74 69     (3)  Co-routi
2da60 6e 65 73 20 61 72 65 20 6e 6f 74 20 64 69 73 61  nes are not disa
2da70 62 6c 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  bled using sqlit
2da80 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2da90 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
2daa0 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
2dab0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
2dac0 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  NS..    **.    *
2dad0 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72  * TODO: Are ther
2dae0 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20  e other reasons 
2daf0 62 65 73 69 64 65 20 28 31 29 20 74 6f 20 75 73  beside (1) to us
2db00 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20  e a co-routine. 
2db10 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
2db20 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20  tion?.    */.   
2db30 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26   if( i==0.     &
2db40 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
2db50 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20  c==1.           
2db60 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61   || (pTabList->a
2db70 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26  [1].fg.jointype&
2db80 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
2db90 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20  S))!=0)  /* (1) 
2dba0 2a 2f 0a 20 20 20 20 20 26 26 20 28 70 2d 3e 73  */.     && (p->s
2dbb0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c  elFlags & SF_All
2dbc0 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )==0            
2dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbe0 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
2dbf0 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
2dc00 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
2dc10 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f   SQLITE_SubqCoro
2dc20 75 74 69 6e 65 29 20 20 20 20 20 20 20 20 20 20  utine)          
2dc30 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20       /* (3) */. 
2dc40 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
2dc50 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f  mplement a co-ro
2dc60 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2dc70 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20  return a single 
2dc80 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
2dc90 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f  t.      ** set o
2dca0 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f  n each invocatio
2dcb0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
2dcc0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d 20    int addrTop = 
2dcd0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2dce0 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20 20  ntAddr(v)+1;.   
2dcf0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2dd00 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2dd10 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
2dd20 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2dd30 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e   OP_InitCoroutin
2dd40 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
2dd50 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29  urn, 0, addrTop)
2dd60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2dd70 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
2dd80 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2dd90 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
2dda0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
2ddb0 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
2ddc0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
2ddd0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
2dde0 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
2ddf0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2de00 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
2de10 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
2de20 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
2de30 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
2de40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2de50 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2de60 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
2de70 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
2de80 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
2de90 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
2dea0 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76       pItem->fg.v
2deb0 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
2dec0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
2ded0 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
2dee0 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
2def0 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
2df00 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65  ine(v, pItem->re
2df10 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
2df20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2df30 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
2df40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2df50 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2df60 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
2df70 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
2df80 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2df90 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
2dfa0 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
2dfb0 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
2dfc0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
2dfd0 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
2dfe0 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
2dff0 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
2e000 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
2e010 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2e020 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
2e030 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
2e040 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
2e050 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
2e060 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
2e070 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
2e080 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
2e090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2e0a0 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
2e0b0 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
2e0c0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
2e0d0 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74 72  tAddr;.      str
2e0e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2e0f0 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20 20   *pPrior;..     
2e100 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
2e110 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
2e120 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2e130 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
2e140 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2e150 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
2e160 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2e170 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
2e180 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
2e190 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
2e1a0 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
2e1b0 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
2e1c0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  ( pItem->fg.isCo
2e1d0 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
2e1e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2e1f0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
2e200 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
2e210 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
2e220 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
2e230 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
2e240 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
2e250 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
2e260 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
2e270 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
2e280 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
2e290 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
2e2a0 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
2e2b0 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
2e2c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2e2d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2e2e0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
2e2f0 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
2e300 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2e310 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e320 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
2e330 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
2e340 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
2e350 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2e360 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
2e370 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53 65     pPrior = isSe
2e380 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62 4c  lfJoinView(pTabL
2e390 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20 20  ist, pItem);.   
2e3a0 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 7b     if( pPrior ){
2e3b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e3c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e3d0 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d 2d  _OpenDup, pItem-
2e3e0 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f 72  >iCursor, pPrior
2e3f0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2e400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e410 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2e420 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2e430 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
2e440 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2e450 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2e460 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2e470 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2e480 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2e490 49 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Id);.        sql
2e4a0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
2e4b0 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
2e4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2e4d0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
2e4e0 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
2e4f0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
2e500 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
2e510 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2e520 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
2e530 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
2e540 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2e550 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2e560 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2e570 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
2e580 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
2e590 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
2e5a0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2e5b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2e5c0 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
2e5d0 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
2e5e0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2e5f0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
2e600 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2e610 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2e620 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2e630 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  end;.    pParse-
2e640 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69  >nHeight -= sqli
2e650 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2e660 67 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20  ght(p);.#endif. 
2e670 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73   }..  /* Various
2e680 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
2e690 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69   SELECT copied i
2e6a0 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  nto local variab
2e6b0 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  les for.  ** con
2e6c0 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45  venience */.  pE
2e6d0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
2e6e0 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
2e6f0 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
2e700 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
2e710 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
2e720 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
2e730 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
2e740 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2e750 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
2e760 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2e770 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2e780 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2e790 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
2e7a0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
2e7b0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
2e7c0 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  er all FROM-clau
2e7d0 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  se analysis:\n")
2e7e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2e7f0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2e800 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2e810 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  f..  /* If the q
2e820 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
2e830 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
2e840 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
2e850 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
2e860 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
2e870 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
2e880 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
2e890 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
2e8a0 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
2e8b0 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2e8c0 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
2e8d0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
2e8e0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
2e8f0 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
2e900 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2e910 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
2e920 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
2e930 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
2e940 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
2e950 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
2e960 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42  P BY xyz ORDER B
2e970 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2e980 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
2e990 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73 20  is preferred as 
2e9a0 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28  a single index (
2e9b0 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d  or temp-table) m
2e9c0 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64  ay be .  ** used
2e9d0 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52   for both the OR
2e9e0 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54 49  DER BY and DISTI
2e9f0 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  NCT processing. 
2ea00 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20  As originally . 
2ea10 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20   ** written the 
2ea20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20 61  query must use a
2ea30 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
2ea40 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20  at least one of 
2ea50 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20  the ORDER .  ** 
2ea60 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c  BY and DISTINCT,
2ea70 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72   and an index or
2ea80 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74   separate temp-t
2ea90 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68  able for the oth
2eaa0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
2eab0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
2eac0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
2ead0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
2eae0 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71  stinct .   && sq
2eaf0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
2eb00 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65  pare(sSort.pOrde
2eb10 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29  rBy, pEList, -1)
2eb20 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  ==0.  ){.    p->
2eb30 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
2eb40 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47  Distinct;.    pG
2eb50 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
2eb60 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
2eb70 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45  prListDup(db, pE
2eb80 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a  List, 0);.    /*
2eb90 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76 65   Notice that eve
2eba0 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73  n thought SF_Dis
2ebb0 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63  tinct has been c
2ebc0 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73  leared from p->s
2ebd0 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20  elFlags,.    ** 
2ebe0 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73  the sDistinct.is
2ebf0 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65  Tnct is still se
2ec00 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63  t.  Hence, isTnc
2ec10 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
2ec20 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c  .    ** original
2ec30 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20   setting of the 
2ec40 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67  SF_Distinct flag
2ec50 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e  , not the curren
2ec60 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20  t setting */.   
2ec70 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69 6e   assert( sDistin
2ec80 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69  ct.isTnct );..#i
2ec90 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2eca0 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
2ecb0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2ecc0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
2ecd0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2ece0 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54  400,pParse,p,("T
2ecf0 72 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43  ransform DISTINC
2ed00 54 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a  T into GROUP BY:
2ed10 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  \n"));.      sql
2ed20 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
2ed30 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
2ed40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20   }.#endif.  }.. 
2ed50 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2ed60 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2ed70 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  se, then create 
2ed80 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
2ed90 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68  ex to.  ** do th
2eda0 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20  e sorting.  But 
2edb0 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68  this sorting eph
2edc0 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67  emeral index mig
2edd0 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62  ht end up.  ** b
2ede0 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
2edf0 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 65  he data can be e
2ee00 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d  xtracted in pre-
2ee10 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20  sorted order..  
2ee20 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20 74 68  ** If that is th
2ee30 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
2ee40 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2ee50 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
2ee60 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67  ll be.  ** chang
2ee70 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70  ed to an OP_Noop
2ee80 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65 20   once we figure 
2ee90 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
2eea0 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20  ting index is.  
2eeb0 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  ** not needed.  
2eec0 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  The sSort.addrSo
2eed0 72 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65  rtIndex variable
2eee0 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
2eef0 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74  litate.  ** that
2ef00 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
2ef10 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2ef20 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
2ef30 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
2ef40 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49   pKeyInfo = keyI
2ef50 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
2ef60 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f  pParse, sSort.pO
2ef70 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73  rderBy, 0, pELis
2ef80 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73  t->nExpr);.    s
2ef90 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20  Sort.iECursor = 
2efa0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2efb0 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f      sSort.addrSo
2efc0 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
2efd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2efe0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
2eff0 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
2f000 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c   sSort.iECursor,
2f010 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d   sSort.pOrderBy-
2f020 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d  >nExpr+1+pEList-
2f030 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20  >nExpr, 0,.     
2f040 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
2f050 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2f060 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  .      );.  }els
2f070 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  e{.    sSort.add
2f080 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b  rSortIndex = -1;
2f090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2f0a0 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74  e output is dest
2f0b0 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f  ined for a tempo
2f0c0 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e  rary table, open
2f0d0 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a   that table..  *
2f0e0 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65  /.  if( pDest->e
2f0f0 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
2f100 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ab ){.    sqlite
2f110 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2f120 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2f130 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
2f140 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
2f150 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2f160 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
2f170 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  .  iEnd = sqlite
2f180 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2f190 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
2f1a0 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65 64  Flags & SF_Fixed
2f1b0 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20  Limit)==0 ){.   
2f1c0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
2f1d0 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c   320;  /* 4 bill
2f1e0 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a  ion rows */.  }.
2f1f0 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
2f200 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
2f210 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20  p, iEnd);.  if( 
2f220 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20  p->iLimit==0 && 
2f230 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2f240 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71  dex>=0 ){.    sq
2f250 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f  lite3VdbeChangeO
2f260 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61  pcode(v, sSort.a
2f270 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50  ddrSortIndex, OP
2f280 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20  _SorterOpen);.  
2f290 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67    sSort.sortFlag
2f2a0 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73  s |= SORTFLAG_Us
2f2b0 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20  eSorter;.  }..  
2f2c0 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d  /* Open an ephem
2f2d0 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73  eral index to us
2f2e0 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e  e for the distin
2f2f0 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ct set..  */.  i
2f300 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
2f310 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   SF_Distinct ){.
2f320 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
2f330 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  bTnct = pParse->
2f340 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73  nTab++;.    sDis
2f350 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d  tinct.addrTnct =
2f360 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2f370 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
2f380 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
2f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3a0 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74       sDistinct.t
2f3b0 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  abTnct, 0, 0,.  
2f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3d0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2f3e0 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  *)keyInfoFromExp
2f3f0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d  rList(pParse, p-
2f400 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20  >pEList,0,0),.  
2f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f420 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
2f430 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
2f440 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2f450 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
2f460 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
2f470 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2f480 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2f490 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
2f4a0 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
2f4b0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
2f4c0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
2f4d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
2f4e0 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
2f4f0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
2f500 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
2f510 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
2f520 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
2f530 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
2f540 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
2f550 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
2f560 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
2f570 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45 52      assert( WHER
2f580 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f  E_USE_LIMIT==SF_
2f590 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20  FixedLimit );.  
2f5a0 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20    wctrlFlags |= 
2f5b0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2f5c0 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20  _FixedLimit;..  
2f5d0 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64    /* Begin the d
2f5e0 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f  atabase scan. */
2f5f0 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71  .    pWInfo = sq
2f600 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2f610 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2f620 2c 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e  , pWhere, sSort.
2f630 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f650 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
2f660 73 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  st, wctrlFlags, 
2f670 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  p->nSelectRow);.
2f680 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
2f690 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2f6a0 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  end;.    if( sql
2f6b0 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2f6c0 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20  owCount(pWInfo) 
2f6d0 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  < p->nSelectRow 
2f6e0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  ){.      p->nSel
2f6f0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
2f700 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
2f710 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  unt(pWInfo);.   
2f720 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74   }.    if( sDist
2f730 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73  inct.isTnct && s
2f740 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73  qlite3WhereIsDis
2f750 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b  tinct(pWInfo) ){
2f760 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74  .      sDistinct
2f770 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c  .eTnctType = sql
2f780 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69  ite3WhereIsDisti
2f790 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  nct(pWInfo);.   
2f7a0 20 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74   }.    if( sSort
2f7b0 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
2f7c0 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20     sSort.nOBSat 
2f7d0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
2f7e0 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b  Ordered(pWInfo);
2f7f0 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f 72  .      sSort.bOr
2f800 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d  deredInnerLoop =
2f810 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64   sqlite3WhereOrd
2f820 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57  eredInnerLoop(pW
2f830 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
2f840 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73   sSort.nOBSat==s
2f850 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
2f860 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
2f870 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
2f880 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2f890 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72  }..    /* If sor
2f8a0 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20  ting index that 
2f8b0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
2f8c0 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70   prior OP_OpenEp
2f8d0 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20  hemeral .    ** 
2f8e0 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65  instruction ende
2f8f0 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e  d up not being n
2f900 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e  eeded, then chan
2f910 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
2f920 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69  hemeral.    ** i
2f930 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a  nto an OP_Noop..
2f940 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2f950 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2f960 65 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70  ex>=0 && sSort.p
2f970 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2f980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2f990 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73  hangeToNoop(v, s
2f9a0 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
2f9b0 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ex);.    }..    
2f9c0 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64  /* Use the stand
2f9d0 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20  ard inner loop. 
2f9e0 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  */.    selectInn
2f9f0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2fa00 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26 73  , pEList, -1, &s
2fa10 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
2fa20 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2fa40 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75  ite3WhereContinu
2fa50 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a  eLabel(pWInfo),.
2fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa70 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2fa80 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66  BreakLabel(pWInf
2fa90 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64  o));..    /* End
2faa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2fab0 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
2fac0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2fad0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  End(pWInfo);.  }
2fae0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
2faf0 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72  s case when ther
2fb00 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74  e exist aggregat
2fb10 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61  e functions or a
2fb20 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2fb30 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20  .    ** or both 
2fb40 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
2fb50 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61  xt sNC;    /* Na
2fb60 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
2fb70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67  rocessing aggreg
2fb80 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ate information 
2fb90 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d  */.    int iAMem
2fba0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2fbb0 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2fbc0 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72  for storing curr
2fbd0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ent GROUP BY */.
2fbe0 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20      int iBMem;  
2fbf0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2fc00 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
2fc10 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20   previous GROUP 
2fc20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55  BY */.    int iU
2fc30 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  seFlag;       /*
2fc40 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c   Mem address hol
2fc50 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61  ding flag indica
2fc60 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61  ting that at lea
2fc70 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
2fc80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e             ** on
2fc90 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70  e row of the inp
2fca0 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ut to the aggreg
2fcb0 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20  ator has been.  
2fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcd0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
2fce0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  ed */.    int iA
2fcf0 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a  bortFlag;     /*
2fd00 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69   Mem address whi
2fd10 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20  ch causes query 
2fd20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76  abort if positiv
2fd30 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f  e */.    int gro
2fd40 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20  upBySort;    /* 
2fd50 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73  Rows come from s
2fd60 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42  ource in GROUP B
2fd70 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69  Y order */.    i
2fd80 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20  nt addrEnd;     
2fd90 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f     /* End of pro
2fda0 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
2fdb0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69   SELECT */.    i
2fdc0 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b  nt sortPTab = 0;
2fdd0 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c     /* Pseudotabl
2fde0 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65  e used to decode
2fdf0 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73   sorting results
2fe00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2fe10 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f  Out = 0;    /* O
2fe20 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66  utput register f
2fe30 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a  rom the sorter *
2fe40 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42  /.    int orderB
2fe50 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75  yGrp = 0; /* Tru
2fe60 65 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42  e if the GROUP B
2fe70 59 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61  Y and ORDER BY a
2fe80 72 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a  re the same */..
2fe90 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
2fea0 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
2feb0 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
2fec0 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
2fed0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
2fee0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
2fef0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
2ff00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ff30 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
2ff40 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2ff50 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
2ff60 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2ff70 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
2ff80 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
2ff90 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
2ffa0 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
2ffb0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
2ffc0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
2ffd0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
2ffe0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
2fff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
30000 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
30010 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
30020 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
30030 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
30040 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
30050 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
30060 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
30070 28 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 66==sqlite3Log
30080 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20  Est(100) );.    
30090 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
300a0 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c  Row>66 ) p->nSel
300b0 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20  ectRow = 66;.   
300c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
300d0 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
300e0 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20  LogEst(1) );.   
300f0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
30100 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
30110 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
30120 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20  both a GROUP BY 
30130 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20  and an ORDER BY 
30140 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20  clause and they 
30150 61 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74  are.    ** ident
30160 69 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61  ical, then it ma
30170 79 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  y be possible to
30180 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44   disable the ORD
30190 45 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20  ER BY clause .  
301a0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75    ** on the grou
301b0 6e 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f  nds that the GRO
301c0 55 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65  UP BY will cause
301d0 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d   elements to com
301e0 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e  e out .    ** in
301f0 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
30200 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20  er. It also may 
30210 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20  not - the GROUP 
30220 42 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20  BY might use a. 
30230 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
30240 6e 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73  ndex that causes
30250 20 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75   rows to be grou
30260 70 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20  ped together as 
30270 72 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20  required.    ** 
30280 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  but not actually
30290 20 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20   sorted. Either 
302a0 77 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20  way, record the 
302b0 66 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20  fact that the.  
302c0 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e    ** ORDER BY an
302d0 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  d GROUP BY claus
302e0 65 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  es are the same 
302f0 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f  by setting the o
30300 72 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a  rderByGrp.    **
30310 20 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20   variable.  */. 
30320 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
30330 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47  prListCompare(pG
30340 72 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f  roupBy, sSort.pO
30350 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29  rderBy, -1)==0 )
30360 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47  {.      orderByG
30370 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a  rp = 1;.    }. .
30380 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
30390 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
303a0 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
303b0 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
303c0 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
303d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
303e0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
303f0 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
30400 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
30410 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
30420 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
30430 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
30440 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
30450 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
30460 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
30470 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
30480 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
30490 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
304a0 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
304b0 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
304c0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
304d0 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
304e0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
304f0 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
30500 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
30510 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d  sAggInfo.mnReg =
30520 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
30530 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
30540 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
30550 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
30560 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20  By->nExpr : 0;. 
30570 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
30580 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
30590 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
305a0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
305b0 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
305c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
305d0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
305e0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
305f0 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
30600 6e 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ng ){.      if( 
30610 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
30620 20 20 20 20 61 73 73 65 72 74 28 20 70 57 68 65      assert( pWhe
30630 72 65 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b  re==p->pWhere );
30640 0a 20 20 20 20 20 20 20 20 68 61 76 69 6e 67 54  .        havingT
30650 6f 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70  oWhere(pParse, p
30660 47 72 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67  GroupBy, pHaving
30670 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , &p->pWhere);. 
30680 20 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20         pWhere = 
30690 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  p->pWhere;.     
306a0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
306b0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
306c0 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76  gates(&sNC, pHav
306d0 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ing);.    }.    
306e0 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75  sAggInfo.nAccumu
306f0 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f  lator = sAggInfo
30700 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f  .nColumn;.    fo
30710 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
30720 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  o.nFunc; i++){. 
30730 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
30740 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41  prHasProperty(sA
30750 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
30760 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
30770 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
30780 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  C.ncFlags |= NC_
30790 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20  InAggFunc;.     
307a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
307b0 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
307c0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
307d0 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  i].pExpr->x.pLis
307e0 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63  t);.      sNC.nc
307f0 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41  Flags &= ~NC_InA
30800 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20  ggFunc;.    }.  
30810 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67    sAggInfo.mxReg
30820 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   = pParse->nMem;
30830 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
30840 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
30850 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20   select_end;..  
30860 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20    /* Processing 
30870 66 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77  for aggregates w
30880 69 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20  ith GROUP BY is 
30890 76 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61  very different a
308a0 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d  nd.    ** much m
308b0 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e  ore complex than
308c0 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
308d0 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a  out a GROUP BY..
308e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
308f0 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
30900 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
30910 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69  fo;  /* Keying i
30920 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
30930 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75  he group by clau
30940 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  se */.      int 
30950 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
30960 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72  /* A-vs-B compar
30970 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20  ision jump */.  
30980 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70      int addrOutp
30990 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74  utRow;  /* Start
309a0 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74   of subroutine t
309b0 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65  hat outputs a re
309c0 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20  sult row */.    
309d0 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52    int regOutputR
309e0 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ow;   /* Return 
309f0 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
30a00 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72   for output subr
30a10 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20  outine */.      
30a20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74  int addrSetAbort
30a30 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61  ;   /* Set the a
30a40 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65  bort flag and re
30a50 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  turn */.      in
30a60 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b  t addrTopOfLoop;
30a70 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
30a80 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20  input loop */.  
30a90 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74      int addrSort
30aa0 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f  ingIdx; /* The O
30ab0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
30ac0 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  for the sorting 
30ad0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
30ae0 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20  nt addrReset;   
30af0 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65     /* Subroutine
30b00 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74   for resetting t
30b10 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a  he accumulator *
30b20 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
30b30 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52  eset;       /* R
30b40 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
30b50 67 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74  gister for reset
30b60 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a   subroutine */..
30b70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
30b80 65 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20  e is a GROUP BY 
30b90 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20  clause we might 
30ba0 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69  need a sorting i
30bb0 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ndex to.      **
30bc0 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20   implement it.  
30bd0 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f  Allocate that so
30be0 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e  rting index now.
30bf0 20 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75    If it turns ou
30c00 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  t.      ** that 
30c10 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69  we do not need i
30c20 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65  t after all, the
30c30 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69   OP_SorterOpen i
30c40 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20  nstruction.     
30c50 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76   ** will be conv
30c60 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f  erted into a Noo
30c70 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  p.  .      */.  
30c80 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72      sAggInfo.sor
30c90 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65  tingIdx = pParse
30ca0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
30cb0 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
30cc0 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
30cd0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
30ce0 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f   0, sAggInfo.nCo
30cf0 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64  lumn);.      add
30d00 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71  rSortingIdx = sq
30d10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
30d20 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
30d30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
30d40 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
30d50 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
30d60 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
30d70 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
30d80 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
30d90 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  INFO);..      /*
30da0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
30db0 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
30dc0 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
30dd0 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
30de0 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
30df0 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
30e00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
30e10 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
30e20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
30e30 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52        regOutputR
30e40 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
30e50 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  Mem;.      addrO
30e60 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
30e70 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
30e80 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73  v);.      regRes
30e90 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
30ea0 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52  Mem;.      addrR
30eb0 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
30ec0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
30ed0 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
30ee0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
30ef0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
30f00 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
30f10 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
30f20 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
30f30 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
30f40 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
30f50 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
30f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
30f80 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
30f90 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
30fa0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
30fb0 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
30fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
30fe0 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
30ff0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
31000 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
31010 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
31020 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
31030 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31040 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
31050 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b  0, iAMem, iAMem+
31060 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
31070 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  1);..      /* Be
31080 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
31090 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
310a0 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
310b0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
310c0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
310d0 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
310e0 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
310f0 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
31100 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
31110 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
31120 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
31130 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
31140 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
31150 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
31160 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
31170 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
31180 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
31190 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
311a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
311b0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
311c0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
311d0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
311e0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
311f0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
31200 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  ere, pGroupBy, 0
31210 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  ,.          WHER
31220 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64  E_GROUPBY | (ord
31230 65 72 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f  erByGrp ? WHERE_
31240 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29  SORTBYGROUP : 0)
31250 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
31260 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
31270 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
31280 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  nd;.      if( sq
31290 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
312a0 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72  red(pWInfo)==pGr
312b0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  oupBy->nExpr ){.
312c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
312d0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
312e0 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
312f0 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
31300 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
31310 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
31320 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
31330 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
31340 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
31350 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
31360 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
31370 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
31380 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
31390 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
313a0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
313b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
313c0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
313d0 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
313e0 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
313f0 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
31400 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
31410 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
31420 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
31430 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
31440 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
31450 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
31460 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
31470 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
31480 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
31490 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
314a0 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
314b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
314c0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
314d0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
314e0 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
314f0 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
31500 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
31510 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54          explainT
31520 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
31530 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73   .            (s
31540 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
31550 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26  && (p->selFlags&
31560 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29  SF_Distinct)==0)
31570 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
31580 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54         "DISTINCT
31590 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b  " : "GROUP BY");
315a0 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
315b0 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
315c0 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
315d0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
315e0 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
315f0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
31600 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  j = nGroupBy;.  
31610 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
31620 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
31630 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
31640 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e     if( sAggInfo.
31650 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43  aCol[i].iSorterC
31660 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
31670 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
31680 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
31690 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
316a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
316b0 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
316c0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
316d0 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
316e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
316f0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
31700 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
31710 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
31720 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
31730 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c  pBy, regBase, 0,
31740 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d   0);.        j =
31750 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
31760 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
31770 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
31780 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
31790 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
317a0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
317b0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
317c0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
317d0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
317e0 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
317f0 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
31800 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
31810 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
31820 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  odeGetColumnToRe
31830 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
31840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31850 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
31860 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
31870 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
31880 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
31890 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
318a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
318b0 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64         regRecord
318c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
318d0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
318e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
318f0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
31900 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
31910 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f  e, nCol, regReco
31920 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
31930 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
31940 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
31950 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
31960 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
31970 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
31980 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
31990 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
319a0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
319b0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
319c0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
319d0 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
319e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
319f0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
31a00 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
31a10 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d  sortingIdxPTab =
31a20 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72   sortPTab = pPar
31a30 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
31a40 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71      sortOut = sq
31a50 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
31a60 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
31a70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31a80 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
31a90 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73  udo, sortPTab, s
31aa0 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20  ortOut, nCol);. 
31ab0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
31ac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
31ad0 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49  orterSort, sAggI
31ae0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
31af0 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
31b00 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
31b10 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74  , "GROUP BY sort
31b20 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ")); VdbeCoverag
31b30 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41  e(v);.        sA
31b40 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
31b50 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
31b60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
31b70 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
31b80 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ..      }..     
31b90 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
31ba0 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61   or temporary ta
31bb0 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ble used by the 
31bc0 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20  GROUP BY sort.  
31bd0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75      ** will natu
31be0 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f  rally deliver ro
31bf0 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ws in the order 
31c00 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
31c10 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
31c20 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c  * clause, cancel
31c30 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
31c40 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20  able open coded 
31c50 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a  earlier..      *
31c60 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
31c70 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
31c80 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74  on - the correct
31c90 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72   answer should r
31ca0 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73  esult regardless
31cb0 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74  ..      ** Use t
31cc0 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  he SQLITE_GroupB
31cd0 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68  yOrder flag with
31ce0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
31cf0 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20  _OPTIMIZER to . 
31d00 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
31d10 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
31d20 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  n for testing pu
31d30 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20  rposes.  */.    
31d40 20 20 69 66 28 20 6f 72 64 65 72 42 79 47 72 70    if( orderByGrp
31d50 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
31d60 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
31d70 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
31d80 20 0a 20 20 20 20 20 20 20 26 26 20 28 67 72 6f   .       && (gro
31d90 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69  upBySort || sqli
31da0 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
31db0 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20  (pWInfo)).      
31dc0 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
31dd0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
31de0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
31df0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
31e00 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
31e10 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a  Index);.      }.
31e20 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
31e30 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
31e40 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
31e50 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
31e60 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
31e70 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
31e80 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
31e90 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
31ea0 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
31eb0 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
31ec0 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
31ed0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
31ee0 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
31ef0 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
31f00 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
31f10 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
31f20 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
31f30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
31f40 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
31f50 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
31f60 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
31f70 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
31f80 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
31f90 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
31fa0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
31fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31fc0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
31fd0 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
31fe0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
31ff0 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
32000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
32010 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62  ortOut, sortPTab
32020 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32030 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
32040 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
32050 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
32060 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
32070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
32080 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
32090 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
320a0 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
320b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
320c0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
320d0 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
320e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
320f0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
32100 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
32110 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
32120 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32130 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
32140 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
32150 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
32160 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
32170 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
32180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32190 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
321a0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
321b0 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
321c0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72  NFO);.      addr
321d0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
321e0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
321f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32200 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
32210 70 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c 20 61  p, addr1+1, 0, a
32220 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  ddr1+1); VdbeCov
32230 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
32240 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
32250 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
32260 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
32270 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
32280 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74   ** Changes in t
32290 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
322a0 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
322b0 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
322c0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
322d0 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
322e0 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
322f0 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
32300 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32310 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
32320 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
32330 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
32340 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
32350 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
32360 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
32370 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
32380 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
32390 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
323a0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
323b0 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
323c0 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
323d0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
323e0 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
323f0 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
32400 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
32410 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
32420 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20  , iBMem, iAMem, 
32430 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29  pGroupBy->nExpr)
32440 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
32450 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
32460 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
32470 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
32480 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
32490 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
324a0 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
324b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
324c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
324d0 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
324e0 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f  addrEnd); VdbeCo
324f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
32500 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
32510 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
32520 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
32530 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32540 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
32550 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
32560 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
32570 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
32580 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
32590 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
325a0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
325b0 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
325c0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
325d0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
325e0 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
325f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
32600 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
32610 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
32620 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
32630 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
32640 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
32650 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
32660 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
32670 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
32680 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
32690 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
326a0 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
326b0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
326c0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
326d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
326e0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
326f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
32700 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
32710 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49  orterNext, sAggI
32720 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
32730 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
32740 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
32750 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
32760 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
32770 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
32780 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  Info);.        s
32790 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
327a0 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f  ToNoop(v, addrSo
327b0 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20  rtingIdx);.     
327c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74   }..      /* Out
327d0 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f  put the final ro
327e0 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20  w of result.    
327f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
32800 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32810 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
32820 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70  putRow, addrOutp
32830 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
32840 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f  beComment((v, "o
32850 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22  utput final row"
32860 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75  ));..      /* Ju
32870 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72  mp over the subr
32880 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f  outines.      */
32890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
328a0 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e  beGoto(v, addrEn
328b0 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
328c0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
328d0 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
328e0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
328f0 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
32900 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
32910 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
32920 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
32930 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
32940 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
32950 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
32960 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
32970 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
32980 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
32990 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
329a0 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
329b0 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
329c0 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
329d0 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
329e0 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
329f0 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
32a00 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
32a10 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
32a20 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
32a30 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
32a40 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
32a50 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
32a60 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
32a70 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
32a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32a90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
32aa0 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
32ab0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
32ac0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
32ad0 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
32ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
32af0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
32b00 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
32b10 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
32b20 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
32b30 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
32b40 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
32b50 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
32b60 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
32b70 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
32b80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
32b90 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
32ba0 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
32bb0 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
32bc0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
32bd0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
32be0 74 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72  t((v, "Groupby r
32bf0 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20  esult generator 
32c00 65 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a  entry point"));.
32c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32c20 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
32c30 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
32c40 6f 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c  ow);.      final
32c50 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
32c60 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
32c70 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
32c80 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
32c90 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
32ca0 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
32cb0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
32cc0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
32cd0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
32ce0 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d   p, p->pEList, -
32cf0 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20  1, &sSort,.     
32d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d10 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
32d20 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
32d30 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
32d40 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
32d50 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
32d60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32d70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
32d80 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
32d90 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
32da0 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
32db0 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
32dc0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
32dd0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
32de0 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
32df0 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
32e00 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
32e10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
32e20 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
32e30 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
32e40 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
32e50 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
32e60 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
32e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
32e80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
32e90 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
32ea0 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
32eb0 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
32ec0 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
32ed0 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
32ee0 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
32ef0 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
32f00 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
32f10 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
32f20 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
32f30 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
32f40 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
32f50 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
32f60 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
32f70 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
32f80 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
32f90 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
32fa0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
32fb0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
32fc0 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
32fd0 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
32fe0 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
32ff0 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
33000 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
33010 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
33020 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
33030 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
33040 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
33050 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
33060 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
33070 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
33080 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
33090 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
330a0 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
330b0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
330c0 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
330d0 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
330e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
330f0 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
33100 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
33110 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
33120 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
33130 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
33140 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
33150 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
33160 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
33170 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
33180 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
33190 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
331a0 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
331b0 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
331c0 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
331d0 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
331e0 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
331f0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
33200 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
33210 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
33220 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
33230 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
33240 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
33250 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
33260 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
33270 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
33280 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
33290 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
332a0 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
332b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332c0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
332d0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
332e0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
332f0 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
33300 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
33310 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
33320 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
33330 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
33340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33350 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
33360 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
33370 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
33380 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
33390 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
333a0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
333b0 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
333c0 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
333d0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
333e0 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
333f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
33400 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
33410 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
33420 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
33430 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
33440 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
33450 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
33460 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f  e lowest scan co
33470 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st..        **. 
33480 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d         ** (2011-
33490 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f  04-15) Do not do
334a0 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
334b0 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64  an unordered ind
334c0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
334d0 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d         ** (2013-
334e0 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f  10-03) Do not co
334f0 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20  unt the entries 
33500 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  in a partial ind
33510 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
33520 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
33530 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
33540 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
33550 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
33560 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
33570 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
33580 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
33590 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
335a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48  /.        if( !H
335b0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
335c0 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pBest = sqlite3P
335d0 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
335e0 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  Tab);.        fo
335f0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
33600 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
33610 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
33620 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
33630 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
33640 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
33650 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  dx->szIdxRow<pTa
33660 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20  b->szTabRow.    
33670 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
33680 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
33690 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
336a0 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
336b0 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e  szIdxRow<pBest->
336c0 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20  szIdxRow).      
336d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
336e0 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
336f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
33710 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
33720 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42        iRoot = pB
33730 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  est->tnum;.     
33740 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
33750 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
33760 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42  Index(pParse, pB
33770 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
33780 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
33790 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
337a0 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
337b0 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
337c0 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
337d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
337e0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
337f0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
33800 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31  r, iRoot, iDb, 1
33810 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
33820 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
33830 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33840 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
33850 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
33860 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
33870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33880 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33890 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
338a0 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61  iCsr, sAggInfo.a
338b0 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20  Func[0].iMem);. 
338c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
338d0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
338e0 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20  lose, iCsr);.   
338f0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70       explainSimp
33900 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20  leCount(pParse, 
33910 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20  pTab, pBest);.  
33920 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
33930 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
33940 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
33950 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
33960 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75   Check if the qu
33970 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ery is of one of
33980 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
33990 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  orms:.        **
339a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
339b0 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d  LECT min(x) FROM
339c0 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   ....        ** 
339d0 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20    SELECT max(x) 
339e0 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
339f0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
33a00 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73  f it is, then as
33a10 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68  k the code in wh
33a20 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74  ere.c to attempt
33a30 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73   to sort results
33a40 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69  .        ** as i
33a50 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22  f there was an "
33a60 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22  ORDER ON x" or "
33a70 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22  ORDER ON x DESC"
33a80 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20   clause. .      
33a90 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20    ** If where.c 
33aa0 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75  is able to produ
33ab0 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65  ce results sorte
33ac0 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c  d in this order,
33ad0 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
33ae0 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74   add vdbe code t
33af0 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
33b00 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  he processing lo
33b10 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20  op after the .  
33b20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69        ** first i
33b30 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20  teration (since 
33b40 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
33b50 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
33b60 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  is .        ** g
33b70 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65  uaranteed to ope
33b80 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20  rate on the row 
33b90 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d  with the minimum
33ba0 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20   or maximum .   
33bb0 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
33bc0 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77   x, the only row
33bd0 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20   required)..    
33be0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
33bf0 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67  * A special flag
33c00 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
33c10 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
33c20 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74  egin() to slight
33c30 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ly.        ** mo
33c40 64 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73  dify behavior as
33c50 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
33c60 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
33c70 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79    + If the query
33c80 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69   is a "SELECT mi
33c90 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20  n(x)", then the 
33ca0 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20  loop coded by.  
33cb0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65        **     whe
33cc0 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20  re.c should not 
33cd0 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79  iterate over any
33ce0 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e   values with a N
33cf0 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ULL value.      
33d00 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a    **     for x..
33d10 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
33d20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
33d30 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
33d40 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
33d50 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
33d60 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
33d70 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e       index or in
33d80 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68  dices to use) sh
33d90 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66  ould place a dif
33da0 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20  ferent priority 
33db0 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  on .        **  
33dc0 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
33dd0 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
33de0 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
33df0 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
33e00 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
33e10 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e  Refer to code an
33e20 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68  d comments in wh
33e30 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c  ere.c for detail
33e40 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
33e50 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
33e60 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20  pMinMax = 0;.   
33e70 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57       u8 flag = W
33e80 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
33e90 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  MAL;.        .  
33ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
33eb0 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
33ec0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33ed0 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flag==0 );.     
33ee0 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
33ef0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
33f00 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51    flag = minMaxQ
33f10 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20  uery(&sAggInfo, 
33f20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20  &pMinMax);.     
33f30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
33f40 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20  ert( flag==0 || 
33f50 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70  (pMinMax!=0 && p
33f60 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
33f70 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ) );..        if
33f80 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
33f90 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71      pMinMax = sq
33fa0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
33fb0 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29  (db, pMinMax, 0)
33fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
33fd0 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
33fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
33ff0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
34000 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20 29 3b 0a  | pMinMax!=0 );.
34010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 64            if( !d
34020 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
34030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
34040 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72  MinMax->a[0].sor
34050 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57  tOrder = flag!=W
34060 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
34070 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20   ?1:0;.         
34080 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
34090 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
340a0 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
340b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
340c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
340d0 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74 68   case runs if th
340e0 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73 20  e aggregate has 
340f0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
34100 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  se.  The.       
34110 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69   ** processing i
34120 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73  s much simpler s
34130 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e  ince there is on
34140 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a  ly a single row.
34150 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75          ** of ou
34160 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tput..        */
34170 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41 63  .        resetAc
34180 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
34190 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
341a0 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
341b0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
341c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
341d0 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d  t, pWhere, pMinM
341e0 61 78 2c 20 30 2c 66 6c 61 67 2c 30 29 3b 0a 20  ax, 0,flag,0);. 
341f0 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
34200 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
34210 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
34220 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
34230 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
34240 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
34250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34260 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
34270 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
34280 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  nfo);.        as
34290 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30  sert( pMinMax==0
342a0 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   || pMinMax->nEx
342b0 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  pr==1 );.       
342c0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
342d0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
342e0 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o)>0 ){.        
342f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
34300 6f 28 76 2c 20 73 71 6c 69 74 65 33 57 68 65 72  o(v, sqlite3Wher
34310 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
34320 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  fo));.          
34330 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34340 22 25 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c  "%s() by index",
34350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34360 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52   (flag==WHERE_OR
34370 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a  DERBY_MIN?"min":
34380 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20  "max")));.      
34390 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
343a0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
343b0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e  fo);.        fin
343c0 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
343d0 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
343e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  nfo);.      }.. 
343f0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
34400 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  rBy = 0;.      s
34410 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
34420 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
34430 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49  g, addrEnd, SQLI
34440 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
34450 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
34460 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
34470 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20   p->pEList, -1, 
34480 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  0, 0, .         
34490 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
344a0 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64  st, addrEnd, add
344b0 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEnd);.      sql
344c0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
344d0 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
344e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
344f0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
34500 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
34510 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
34520 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
34530 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e  /..  if( sDistin
34540 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48  ct.eTnctType==WH
34550 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
34560 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78  RDERED ){.    ex
34570 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
34580 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
34590 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ");.  }..  /* If
345a0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
345b0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
345c0 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f  en we need to so
345d0 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  rt the results. 
345e0 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65   ** and send the
345f0 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63  m to the callbac
34600 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  k one by one..  
34610 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
34620 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65  OrderBy ){.    e
34630 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
34640 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
34650 20 20 20 20 20 20 20 20 20 20 20 20 20 73 53 6f               sSo
34660 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52  rt.nOBSat>0 ? "R
34670 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44  IGHT PART OF ORD
34680 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59  ER BY":"ORDER BY
34690 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  ");.    generate
346a0 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c  SortTail(pParse,
346b0 20 70 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69   p, &sSort, pELi
346c0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74  st->nExpr, pDest
346d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  );.  }..  /* Jum
346e0 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
346f0 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20  his query.  */. 
34700 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
34710 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64  lveLabel(v, iEnd
34720 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c  );..  /* The SEL
34730 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
34740 65 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  ed. If there is 
34750 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20  an error in the 
34760 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2c  Parse structure,
34770 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 72 65  .  ** set the re
34780 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20  turn code to 1. 
34790 4f 74 68 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a  Otherwise 0. */.
347a0 20 20 72 63 20 3d 20 28 70 50 61 72 73 65 2d 3e    rc = (pParse->
347b0 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43  nErr>0);..  /* C
347c0 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
347d0 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
347e0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
347f0 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
34800 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
34810 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
34820 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
34830 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53  _end:.  explainS
34840 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
34850 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
34860 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
34870 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
34880 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72  olumn names if r
34890 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45  esults of the SE
348a0 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f  LECT are to be o
348b0 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
348c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
348d0 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  && pDest->eDest=
348e0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
348f0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
34900 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
34910 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
34920 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
34930 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
34940 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
34950 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
34960 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
34970 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
34980 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54  ENABLED.  SELECT
34990 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
349a0 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73 69 6e  ,("end processin
349b0 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72 73 65  g\n"));.  pParse
349c0 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d  ->nSelectIndent-
349d0 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  -;.#endif.  retu
349e0 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.