/ Hex Artifact Content
Login

Artifact 0d2afdbdba5fbc61432c5454a35e0236e7aa4aa3756986a7d51b81a508e8083a:


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 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c  +1) - sizeof(Col
9470: 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66  lSeq*);.  KeyInf
9480: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
9490: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
94a0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
94b0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
94c0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
94d0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
94e0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
94f0: 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28     p->nField = (
9500: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58  u16)N;.    p->nX
9510: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a  Field = (u16)X;.
9520: 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43      p->enc = ENC
9530: 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  (db);.    p->db 
9540: 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = db;.    p->nRe
9550: 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  f = 1;.    memse
9560: 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74  t(&p[1], 0, nExt
9570: 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ra);.  }else{.  
9580: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
9590: 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t(db);.  }.  ret
95a0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
95b0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  Deallocate a Key
95c0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  Info object.*/.v
95d0: 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oid sqlite3KeyIn
95e0: 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20  foUnref(KeyInfo 
95f0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
9600: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
9610: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
9620: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
9630: 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  p->nRef==0 ) sql
9640: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e  ite3DbFreeNN(p->
9650: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
9660: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20  *.** Make a new 
9670: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79  pointer to a Key
9680: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b  Info object.*/.K
9690: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
96a0: 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66  eyInfoRef(KeyInf
96b0: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
96c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
96d0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
96e0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
96f0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66  return p;.}..#if
9700: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
9710: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
9720: 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20  UE if a KeyInfo 
9730: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68  object can be ch
9740: 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e  ange.  The KeyIn
9750: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e  fo object.** can
9760: 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64   only be changed
9770: 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73 74   if this is just
9780: 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65   a single refere
9790: 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63  nce to the objec
97a0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
97b0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
97c0: 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ly inside of ass
97d0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
97e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
97f0: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
9800: 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20  le(KeyInfo *p){ 
9810: 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d  return p->nRef==
9820: 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1; }.#endif /* S
9830: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
9840: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
9850: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
9860: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
9870: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
9880: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
9890: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
98a0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
98b0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
98c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
98d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
98e0: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
98f0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
9900: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
9910: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
9920: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
9930: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
9940: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
9950: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
9960: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
9970: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
9980: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
9990: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
99a0: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
99b0: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
99c0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
99d0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
99e0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
99f0: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
9a00: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
9a10: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
9a20: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
9a30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
9a40: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
9a50: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  d from malloc.  
9a60: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
9a70: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
9a80: 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e  nsible for seein
9a90: 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
9aa0: 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
9ab0: 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
9ac0: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
9ad0: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
9ae0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
9af0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
9b00: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
9b10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9b20: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
9b30: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
9b40: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
9b50: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
9b60: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
9b70: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
9b80: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
9b90: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
9ba0: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
9bb0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
9bc0: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
9bd0: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20   the end */.){. 
9be0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
9bf0: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
9c00: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9c10: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
9c20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9c30: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
9c40: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
9c50: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
9c60: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
9c70: 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
9c80: 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72  pr-iStart, nExtr
9c90: 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  a+1);.  if( pInf
9ca0: 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  o ){.    assert(
9cb0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
9cc0: 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f  sWriteable(pInfo
9cd0: 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69  ) );.    for(i=i
9ce0: 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69  Start, pItem=pLi
9cf0: 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c  st->a+iStart; i<
9d00: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
9d10: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
9d20: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
9d30: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9d40: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
9d50: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
9d60: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
9d70: 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
9d80: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
9d90: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
9da0: 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 43 6f  [i-iStart] = pCo
9db0: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
9dc0: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53  >aSortOrder[i-iS
9dd0: 74 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73  tart] = pItem->s
9de0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
9df0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e    }.  return pIn
9e00: 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d  fo;.}../*.** Nam
9e10: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
9e20: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
9e30: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
9e40: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
9e50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
9e60: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
9e70: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
9e80: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
9e90: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
9ea0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
9eb0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
9ec0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
9ed0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
9ee0: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
9ef0: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
9f00: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
9f10: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
9f20: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
9f30: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
9f40: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
9f50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
9f60: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
9f70: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
9f80: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
9f90: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
9fa0: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
9fb0: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
9fc0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
9fd0: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
9fe0: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
9ff0: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
a000: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
a010: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
a020: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
a030: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
a040: 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45  .**.**   "USE TE
a050: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78  MP B-TREE FOR xx
a060: 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78  x".**.** where x
a070: 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49  xx is one of "DI
a080: 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20  STINCT", "ORDER 
a090: 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59  BY" or "GROUP BY
a0a0: 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68  ". Exactly which
a0b0: 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65  .** is determine
a0c0: 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20  d by the zUsage 
a0d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
a0e0: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
a0f0: 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20  TempTable(Parse 
a100: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
a110: 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20  har *zUsage){.  
a120: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
a130: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
a140: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a150: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
a160: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
a170: 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64  Printf(pParse->d
a180: 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54  b, "USE TEMP B-T
a190: 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73  REE FOR %s", zUs
a1a0: 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  age);.    sqlite
a1b0: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
a1c0: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
a1d0: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
a1e0: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
a1f0: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
a200: 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65  .** Assign expre
a210: 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75  ssion b to lvalu
a220: 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e  e a. A second, n
a230: 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66  o-op, version of
a240: 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69   this macro.** i
a250: 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20  s provided when 
a260: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
a270: 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20  AIN is defined. 
a280: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
a290: 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74  code.** in sqlit
a2a0: 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73  e3Select() to as
a2b0: 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73  sign values to s
a2c0: 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20  tructure member 
a2d0: 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a  variables that.*
a2e0: 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20  * only exist if 
a2f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
a300: 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  AIN is not defin
a310: 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75  ed without pollu
a320: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65  ting the.** code
a330: 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69   with #ifndef di
a340: 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64  rectives..*/.# d
a350: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74  efine explainSet
a360: 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20  Integer(a, b) a 
a370: 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f  = b..#else./* No
a380: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
a390: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
a3a0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
a3b0: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
a3c0: 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  ne explainTempTa
a3d0: 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e  ble(y,z).# defin
a3e0: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
a3f0: 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  ger(y,z).#endif.
a400: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a410: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
a420: 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  N) && !defined(S
a430: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
a440: 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a  UND_SELECT)./*.*
a450: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
a460: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
a470: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
a480: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
a490: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
a4a0: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
a4b0: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
a4c0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
a4d0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
a4e0: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
a4f0: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
a500: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  f one of the two
a510: 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   forms:.**.**   
a520: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
a530: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
a540: 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20  iSub2 (op)".**  
a550: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
a560: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
a570: 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d   iSub2 USING TEM
a580: 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a  P B-TREE (op)".*
a590: 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31  *.** where iSub1
a5a0: 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74   and iSub2 are t
a5b0: 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73  he integers pass
a5c0: 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  ed as the corres
a5d0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  ponding.** funct
a5e0: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20  ion parameters, 
a5f0: 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65  and op is the te
a600: 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  xt representatio
a610: 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  n of the paramet
a620: 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  er.** of the sam
a630: 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61  e name. The para
a640: 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20  meter "op" must 
a650: 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  be one of TK_UNI
a660: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a  ON, TK_EXCEPT,.*
a670: 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f  * TK_INTERSECT o
a680: 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69  r TK_ALL. The fi
a690: 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64  rst form is used
a6a0: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73   if argument bUs
a6b0: 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73  eTmp is .** fals
a6c0: 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  e, or the second
a6d0: 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74   form if it is t
a6e0: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
a6f0: 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f  oid explainCompo
a700: 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70  site(.  Parse *p
a710: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
a720: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
a730: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
a740: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a760: 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e   One of TK_UNION
a770: 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e  , TK_EXCEPT etc.
a780: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c   */.  int iSub1,
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
a7b0: 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20  y id 1 */.  int 
a7c0: 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20  iSub2,          
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a7e0: 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a  ubquery id 2 */.
a7f0: 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20    int bUseTmp   
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74    /* True if a t
a820: 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73  emp table was us
a830: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  ed */.){.  asser
a840: 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  t( op==TK_UNION 
a850: 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  || op==TK_EXCEPT
a860: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
a870: 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41  SECT || op==TK_A
a880: 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72  LL );.  if( pPar
a890: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
a8a0: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
a8b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a8c0: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
a8d0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a  sqlite3MPrintf(.
a8e0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
a8f0: 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55  db, "COMPOUND SU
a900: 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20  BQUERIES %d AND 
a910: 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62  %d %s(%s)", iSub
a920: 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20  1, iSub2,.      
a930: 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47    bUseTmp?"USING
a940: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22   TEMP B-TREE ":"
a950: 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
a960: 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  op).    );.    s
a970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a980: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
a990: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
a9a0: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
a9b0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
a9c0: 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  }.#else./* No-op
a9d0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
a9e0: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
a9f0: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
aa00: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
aa10: 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
aa20: 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64  (v,w,x,y,z).#end
aa30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
aa40: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20   inner loop was 
aa50: 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20  generated using 
aa60: 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65  a non-null pOrde
aa70: 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  rBy argument,.**
aa80: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
aa90: 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e  s were placed in
aaa0: 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65   a sorter.  Afte
aab0: 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65  r the loop is te
aac0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e  rminated.** we n
aad0: 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73  eed to run the s
aae0: 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74  orter and output
aaf0: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
ab00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
ab10: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
ab20: 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65  s the code neede
ab30: 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  d to do that..*/
ab40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
ab50: 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20  erateSortTail(. 
ab60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ab70: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
ab80: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
ab90: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  t *p,        /* 
aba0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
abb0: 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74  ment */.  SortCt
abc0: 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49  x *pSort,   /* I
abd0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68  nformation on th
abe0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
abf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
ac00: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
ac10: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
ac20: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
ac30: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
ac40: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
ac50: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
ac60: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
ac70: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
aca0: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
acb0: 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20    int addrBreak 
acc0: 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f  = pSort->labelDo
acd0: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ne;            /
ace0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
acf0: 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  xit loop */.  in
ad00: 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d  t addrContinue =
ad10: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
ad20: 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75  Label(v);  /* Ju
ad30: 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74  mp here for next
ad40: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
ad50: 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64 72  addr;.  int addr
ad60: 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Once = 0;.  int 
ad70: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
ad80: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f   *pOrderBy = pSo
ad90: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  rt->pOrderBy;.  
ada0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
adb0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
adc0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
add0: 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65  SDParm;.  int re
ade0: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
adf0: 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  owid;.  int iCol
ae00: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20  ;.  int nKey;.  
ae10: 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20  int iSortTab;   
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72  /* Sorter cursor
ae40: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
ae50: 0a 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74 61  .  int nSortData
ae60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ae70: 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76     /* Trailing v
ae80: 61 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66 72  alues to read fr
ae90: 6f 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69  om sorter */.  i
aea0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71  nt i;.  int bSeq
aeb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aec0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
aed0: 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  if sorter record
aee0: 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e   includes seq. n
aef0: 6f 2e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  o. */.  struct E
af00: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f  xprList_item *aO
af10: 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74  utEx = p->pEList
af20: 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ->a;..  assert( 
af30: 61 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20  addrBreak<0 );. 
af40: 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65   if( pSort->labe
af50: 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  lBkOut ){.    sq
af60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
af70: 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f  v, OP_Gosub, pSo
af80: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  rt->regReturn, p
af90: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
afa0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
afb0: 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42 72  beGoto(v, addrBr
afc0: 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eak);.    sqlite
afd0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
afe0: 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65  l(v, pSort->labe
aff0: 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69  lBkOut);.  }.  i
b000: 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43  Tab = pSort->iEC
b010: 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44 65  ursor;.  if( eDe
b020: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
b030: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
b040: 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d  outine || eDest=
b050: 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20  =SRT_Mem ){.    
b060: 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  regRowid = 0;.  
b070: 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73 74    regRow = pDest
b080: 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f  ->iSdst;.    nSo
b090: 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e  rtData = nColumn
b0a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
b0b0: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
b0c0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
b0d0: 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  se);.    regRow 
b0e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b0f0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
b100: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72  olumn);.    nSor
b110: 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  tData = nColumn;
b120: 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f  .  }.  nKey = pO
b130: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20  rderBy->nExpr - 
b140: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
b150: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
b160: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
b170: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
b180: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
b190: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
b1a0: 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20  m;.    iSortTab 
b1b0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
b1c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
b1d0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
b1e0: 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20       addrOnce = 
b1f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b200: 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
b210: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b220: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
b230: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b240: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53  P_OpenPseudo, iS
b250: 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  ortTab, regSortO
b260: 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74  ut, nKey+1+nSort
b270: 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 61  Data);.    if( a
b280: 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65  ddrOnce ) sqlite
b290: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
b2a0: 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20   addrOnce);.    
b2b0: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
b2c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b2d0: 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69  OP_SorterSort, i
b2e0: 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  Tab, addrBreak);
b2f0: 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
b300: 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66  e(v);.    codeOf
b310: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
b320: 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  et, addrContinue
b330: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
b340: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
b350: 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c  orterData, iTab,
b360: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f   regSortOut, iSo
b370: 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71  rtTab);.    bSeq
b380: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
b390: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
b3a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
b3b0: 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62  v, OP_Sort, iTab
b3c0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
b3d0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b3e0: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
b3f0: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
b400: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
b410: 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b  iSortTab = iTab;
b420: 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20  .    bSeq = 1;. 
b430: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43   }.  for(i=0, iC
b440: 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c  ol=nKey+bSeq; i<
b450: 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b  nSortData; i++){
b460: 0a 20 20 20 20 69 6e 74 20 69 52 65 61 64 3b 0a  .    int iRead;.
b470: 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69      if( aOutEx[i
b480: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
b490: 6c 20 29 7b 0a 20 20 20 20 20 20 69 52 65 61 64  l ){.      iRead
b4a0: 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78   = aOutEx[i].u.x
b4b0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a  .iOrderByCol-1;.
b4c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4d0: 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b   iRead = iCol++;
b4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b4f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b500: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
b510: 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67 52  Tab, iRead, regR
b520: 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65 43  ow+i);.    VdbeC
b530: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
b540: 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65   aOutEx[i].zName
b550: 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61   ? aOutEx[i].zNa
b560: 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a  me : aOutEx[i].z
b570: 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77  Span));.  }.  sw
b580: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
b590: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
b5a0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
b5b0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
b5c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b5d0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
b5e0: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
b5f0: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
b600: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b610: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
b620: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
b630: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
b640: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
b650: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
b660: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b670: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
b680: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
b690: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
b6a0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
b6b0: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71  ert( nColumn==sq
b6c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44  lite3Strlen30(pD
b6d0: 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29  est->zAffSdst) )
b6e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b6f0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
b700: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
b710: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67  ow, nColumn, reg
b720: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b740: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20  Dest->zAffSdst, 
b750: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
b760: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
b770: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
b780: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e  Parse, regRow, n
b790: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73  Column);.      s
b7a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b7b0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
b7c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
b7d0: 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43  owid, regRow, nC
b7e0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
b7f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b800: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
b810: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
b820: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
b830: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
b840: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
b850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
b860: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
b870: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b880: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
b890: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
b8a0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a  T_Coroutine ); .
b8b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b8c0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
b8d0: 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
b8e0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
b8f0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
b900: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
b910: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
b920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b930: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
b940: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
b950: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
b960: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b970: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
b980: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
b990: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
b9a0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
b9b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b9c0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
b9d0: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
b9e0: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
b9f0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
ba00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ba10: 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  regRowid ){.    
ba20: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  if( eDest==SRT_S
ba30: 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  et ){.      sqli
ba40: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
ba50: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
ba60: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
ba70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
ba80: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
ba90: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
baa0: 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Row);.    }.    
bab0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
bac0: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
bad0: 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f  gRowid);.  }.  /
bae0: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
baf0: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
bb00: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
bb10: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
bb20: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
bb30: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
bb40: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
bb50: 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  orter ){.    sql
bb60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bb70: 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
bb80: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
bb90: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
bba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
bbb0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
bbc0: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
bbd0: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
bbe0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66  age(v);.  }.  if
bbf0: 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  ( pSort->regRetu
bc00: 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  rn ) sqlite3Vdbe
bc10: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
bc20: 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  urn, pSort->regR
bc30: 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65  eturn);.  sqlite
bc40: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
bc50: 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
bc60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
bc70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
bc80: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
bc90: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
bca0: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
bcb0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
bcc0: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
bcd0: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
bce0: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
bcf0: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c  caller..**.** Al
bd00: 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  so try to estima
bd10: 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
bd20: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
bd30: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  e and return tha
bd40: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a  t.** result in *
bd50: 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a  pEstWidth..**.**
bd60: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
bd70: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
bd80: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
bd90: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
bda0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69   from the.** ori
bdb0: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
bdc0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
bdd0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
bde0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a  s a column. The.
bdf0: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ** declaration t
be00: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
be10: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
be20: 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61  . Exactly when a
be30: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
be40: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
be50: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f  column can be co
be60: 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65  mplex in the pre
be70: 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72  sence of subquer
be80: 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75  ies. The.** resu
be90: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
bea0: 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  n in all of the 
beb0: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
bec0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a   statements is .
bed0: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
bee0: 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66  column by this f
bef0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
bf00: 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d   SELECT col FROM
bf10: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
bf20: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
bf30: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
bf40: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
bf50: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20  FROM tbl);.**   
bf60: 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20  SELECT abc FROM 
bf70: 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61  (SELECT col AS a
bf80: 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  bc FROM tbl);.**
bf90: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
bfa0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
bfb0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68  y expression oth
bfc0: 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e  er than a column
bfd0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
bfe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
bff0: 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70   either 3 or 6 p
c000: 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64  arameters depend
c010: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
c020: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c  r not.** the SQL
c030: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c040: 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69  N_METADATA compi
c050: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
c060: 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  s used..*/.#ifde
c070: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c080: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c090: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
c0a0: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  ype(A,B,C,D,E,F)
c0b0: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
c0c0: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c  A,B,C,D,E,F).#el
c0d0: 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e 65  se /* if !define
c0e0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
c0f0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29  COLUMN_METADATA)
c100: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c   */.# define col
c110: 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c  umnType(A,B,C,D,
c120: 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49  E,F) columnTypeI
c130: 6d 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69  mpl(A,B,F).#endi
c140: 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  f.static const c
c150: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49  har *columnTypeI
c160: 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  mpl(.  NameConte
c170: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
c180: 20 2a 70 45 78 70 72 2c 0a 23 69 66 64 65 66 20   *pExpr,.#ifdef 
c190: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
c1a0: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
c1b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
c1c0: 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  rigDb,.  const c
c1d0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c  har **pzOrigTab,
c1e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
c1f0: 70 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69  pzOrigCol,.#endi
c200: 66 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74  f.  u8 *pEstWidt
c210: 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  h.){.  char cons
c220: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
c230: 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57  int j;.  u8 estW
c240: 69 64 74 68 20 3d 20 31 3b 0a 23 69 66 64 65 66  idth = 1;.#ifdef
c250: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c260: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
c270: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
c280: 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  igDb = 0;.  char
c290: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62   const *zOrigTab
c2a0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
c2b0: 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  st *zOrigCol = 0
c2c0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
c2d0: 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
c2e0: 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
c2f0: 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
c300: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
c310: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
c320: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  _AGG_COLUMN:.   
c330: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
c340: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
c350: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
c360: 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74  column. Locate t
c370: 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c  he table the col
c380: 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  umn is being.   
c390: 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
c3a0: 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74  from in NameCont
c3b0: 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68  ext.pSrcList. Th
c3c0: 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20  is table may be 
c3d0: 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61  real.      ** da
c3e0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20  tabase table or 
c3f0: 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  a subquery..    
c400: 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65    */.      Table
c410: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
c420: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
c430: 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e  structure column
c440: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
c450: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  om */.      Sele
c460: 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20  ct *pS = 0;     
c470: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
c480: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  t the column is 
c490: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
c4a0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  /.      int iCol
c4b0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
c4c0: 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20  n;  /* Index of 
c4d0: 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a  column in pTab *
c4e0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
c4f0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
c500: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  AGG_COLUMN );.  
c510: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
c520: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
c530: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  MN );.      whil
c540: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
c550: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
c560: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
c570: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
c580: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
c590: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
c5a0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
c5b0: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
c5c0: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
c5d0: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
c5e0: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
c5f0: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
c600: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
c610: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
c620: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
c630: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
c640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c650: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
c660: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
c670: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
c680: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
c690: 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
c6a0: 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20  time, code such 
c6b0: 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  as "SELECT new.x
c6c0: 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  " within a trigg
c6d0: 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  er would.       
c6e0: 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63   ** cause this c
c6f0: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e  ondition to run.
c700: 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65    Since then, we
c710: 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72   have restructur
c720: 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a  ed how.        *
c730: 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69  * trigger code i
c740: 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20  s generated and 
c750: 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  so this conditio
c760: 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a  n is no longer .
c770: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
c780: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ble. However, it
c790: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72   can still be tr
c7a0: 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  ue for statement
c7b0: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a  s like.        *
c7c0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  * the following:
c7d0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
c7e0: 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
c7f0: 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54  TABLE t1(col INT
c800: 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a  EGER);.        *
c810: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
c820: 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20  CT t1.col) FROM 
c830: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
c840: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
c850: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
c860: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
c870: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31  e expression "t1
c880: 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20  .col" in the .  
c890: 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c        ** sub-sel
c8a0: 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ect. In this cas
c8b0: 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d  e, set the colum
c8c0: 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20  n type to NULL, 
c8d0: 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  even.        ** 
c8e0: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
c8f0: 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45   really be "INTE
c900: 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a  GER"..        **
c910: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
c920: 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
c930: 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  m, as the column
c940: 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c   type of "t1.col
c950: 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  " is never.     
c960: 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e     ** used. When
c970: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
c980: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
c990: 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20  xpression .     
c9a0: 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74     ** "(SELECT t
c9b0: 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72  1.col)", the cor
c9c0: 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74  rect type is ret
c9d0: 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54  urned (see the T
c9e0: 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20  K_SELECT.       
c9f0: 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77   ** branch below
ca00: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  .  */.        br
ca10: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
ca20: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
ca30: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d   && pExpr->pTab=
ca40: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69  =pTab );.      i
ca50: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
ca60: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
ca70: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
ca80: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
ca90: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
caa0: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
cab0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
cac0: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
cad0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
cae0: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
caf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
cb00: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
cb10: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
cb20: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
cb30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
cb40: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
cb50: 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e  ALWAYS(iCol<pS->
cb60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
cb70: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
cb80: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
cb90: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
cba0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
cbb0: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
cbc0: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
cbd0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
cbe0: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
cbf0: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
cc00: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
cc10: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
cc20: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
cc30: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
cc40: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
cc50: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
cc60: 2a 2a 20 54 68 65 20 41 4c 57 41 59 53 28 29 20  ** The ALWAYS() 
cc70: 69 73 20 62 65 63 61 75 73 65 20 69 43 6f 6c 3e  is because iCol>
cc80: 3d 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  =pS->pEList->nEx
cc90: 70 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  pr will have bee
cca0: 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
ccb0: 61 75 67 68 74 20 61 6c 72 65 61 64 79 20 62 79  aught already by
ccc0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
ccd0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
cce0: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
ccf0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
cd00: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
cd10: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
cd20: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
cd30: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
cd40: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
cd50: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
cd60: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  = pNC;.         
cd70: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
cd80: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
cd90: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
cda0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cdb0: 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54  &zOrigDb,&zOrigT
cdc0: 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  ab,&zOrigCol, &e
cdd0: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
cde0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
cdf0: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65   if( pTab->pSche
ce00: 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ma ){.        /*
ce10: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
ce20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ce30: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
ce40: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
ce50: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
ce60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ce70: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
ce80: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
ce90: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66  ab->nCol) );.#if
cea0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ceb0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
cec0: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
ced0: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
cee0: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
cef0: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
cf00: 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64  OrigCol = "rowid
cf10: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
cf20: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  {.          zOri
cf30: 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  gCol = pTab->aCo
cf40: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
cf50: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
cf60: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
cf70: 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pe(&pTab->aCol[i
cf80: 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20  Col],0);.       
cf90: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
cfa0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
cfb0: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
cfc0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
cfd0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
cfe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
cff0: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
d000: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
d010: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
d020: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
d030: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
d040: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
d050: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
d060: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
d070: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20  b].zDbSName;.   
d080: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
d090: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
d0a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
d0b0: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
d0c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d0d0: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
d0e0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
d0f0: 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pe(&pTab->aCol[i
d100: 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20  Col],0);.       
d110: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
d120: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
d130: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
d140: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
d150: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d160: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
d170: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
d180: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
d190: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
d1a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
d1b0: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
d1c0: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
d1d0: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
d1e0: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
d1f0: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
d200: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
d210: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
d220: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
d230: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
d240: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
d250: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
d260: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
d270: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
d280: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
d290: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
d2a0: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
d2b0: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
d2c0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
d2d0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
d2e0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
d2f0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
d300: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
d310: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
d320: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
d330: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
d340: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
d350: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
d360: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
d370: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
d380: 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  h); .      break
d390: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
d3a0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
d3b0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
d3c0: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
d3d0: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
d3e0: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
d3f0: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
d400: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
d410: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
d420: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
d430: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
d440: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
d450: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
d460: 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a  f( pEstWidth ) *
d470: 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57  pEstWidth = estW
d480: 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a  idth;.  return z
d490: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
d4a0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
d4b0: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
d4c0: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
d4d0: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
d4e0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
d4f0: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
d500: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
d510: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
d520: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
d530: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
d540: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
d550: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
d560: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
d570: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
d580: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
d590: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
d5a0: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
d5b0: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
d5c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
d5d0: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
d5e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d5f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
d600: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
d610: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
d620: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
d630: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
d640: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a   sNC.pNext = 0;.
d650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
d660: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d670: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
d680: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
d690: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
d6a0: 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65  ar *zType;.#ifde
d6b0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d6c0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
d6d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d6e0: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
d6f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d700: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
d710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
d720: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79  Col = 0;.    zTy
d730: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d740: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
d750: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
d760: 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20  OrigCol, 0);..  
d770: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
d780: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
d790: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
d7a0: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
d7b0: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
d7c0: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
d7d0: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
d7e0: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
d7f0: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
d800: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
d810: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
d820: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
d830: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d840: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
d850: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
d860: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d870: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d880: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d890: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
d8a0: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
d8b0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d8c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d8d0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d8e0: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
d8f0: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
d900: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
d910: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
d920: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d930: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , 0, 0, 0, 0);.#
d940: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
d950: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d960: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
d970: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
d980: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d990: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
d9a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d9b0: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
d9c0: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  /.}../*.** Retur
d9d0: 6e 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  n the Table obje
d9e0: 63 63 74 20 69 6e 20 74 68 65 20 53 72 63 4c 69  cct in the SrcLi
d9f0: 73 74 20 74 68 61 74 20 68 61 73 20 63 75 72 73  st that has curs
da00: 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 4f  or iCursor..** O
da10: 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  r return NULL if
da20: 20 6e 6f 20 73 75 63 68 20 54 61 62 6c 65 20 6f   no such Table o
da30: 62 6a 65 63 74 20 65 78 69 73 74 73 20 69 6e 20  bject exists in 
da40: 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a  the SrcList..*/.
da50: 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 74 61  static Table *ta
da60: 62 6c 65 57 69 74 68 43 75 72 73 6f 72 28 53 72  bleWithCursor(Sr
da70: 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e  cList *pList, in
da80: 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e  t iCursor){.  in
da90: 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  t j;.  for(j=0; 
daa0: 6a 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a  j<pList->nSrc; j
dab0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 69  ++){.    if( pLi
dac0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
dad0: 3d 3d 69 43 75 72 73 6f 72 20 29 20 72 65 74 75  ==iCursor ) retu
dae0: 72 6e 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  rn pList->a[j].p
daf0: 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Tab;.  }.  retur
db00: 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  n 0;.}.../*.** G
db10: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
db20: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
db30: 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f  VDBE the names o
db40: 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  f columns.** in 
db50: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
db60: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
db70: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  n is used to pro
db80: 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f  vide the.** azCo
db90: 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68  l[] values in th
dba0: 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73  e callback..*/.s
dbb0: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
dbc0: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
dbd0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
dbe0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
dbf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
dc00: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
dc10: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
dc20: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
dc30: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
dc40: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
dc50: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
dc60: 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  et */.){.  Vdbe 
dc70: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
dc80: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54  be;.  int i;.  T
dc90: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
dca0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
dcb0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
dcc0: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
dcd0: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
dce0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
dcf0: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
dd00: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
dd10: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
dd20: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
dd30: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
dd40: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
dd50: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
dd60: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62  olNamesSet || db
dd70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
dd80: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
dd90: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
dda0: 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30  ert( pTabList!=0
ddb0: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   );.  pParse->co
ddc0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
ddd0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
dde0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
ddf0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
de00: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
de10: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
de20: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
de30: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
de40: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
de50: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
de60: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
de70: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
de80: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
de90: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
dea0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
deb0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
dec0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
ded0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
dee0: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
def0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
df00: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
df10: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
df20: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
df30: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
df40: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
df50: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
df60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
df70: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
df80: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
df90: 43 4f 4c 55 4d 4e 29 0a 20 20 20 20 20 20 20 20  COLUMN).        
dfa0: 20 20 20 26 26 20 28 70 54 61 62 20 3d 20 74 61     && (pTab = ta
dfb0: 62 6c 65 57 69 74 68 43 75 72 73 6f 72 28 70 54  bleWithCursor(pT
dfc0: 61 62 4c 69 73 74 2c 20 70 2d 3e 69 54 61 62 6c  abList, p->iTabl
dfd0: 65 29 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  e))!=0.    ){.  
dfe0: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a      char *zCol;.
dff0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
e000: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20   p->iColumn;.   
e010: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
e020: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
e030: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
e040: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
e050: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
e060: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
e070: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e080: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
e090: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
e0a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
e0b0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
e0c0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
e0d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e0e0: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
e0f0: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
e100: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e110: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e120: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
e130: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e140: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e150: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
e160: 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  an), SQLITE_DYNA
e170: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
e180: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
e190: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
e1a0: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
e1b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e1c0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e1d0: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
e1e0: 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
e1f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e200: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
e210: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
e220: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
e230: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
e240: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
e250: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
e260: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
e270: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
e280: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
e290: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e2a0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
e2b0: 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *z = pEList->a
e2c0: 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
e2d0: 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69   z = z==0 ? sqli
e2e0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e2f0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20  column%d", i+1) 
e300: 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  : sqlite3DbStrDu
e310: 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  p(db, z);.      
e320: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e330: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e340: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c  AME_NAME, z, SQL
e350: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
e360: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
e370: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
e380: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
e390: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
e3a0: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
e3b0: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
e3c0: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
e3d0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
e3e0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
e3f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e400: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
e410: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
e420: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
e430: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
e440: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
e450: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
e460: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
e470: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
e480: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
e490: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
e4a0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
e4b0: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
e4c0: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
e4d0: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
e4e0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
e4f0: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
e500: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
e510: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e520: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
e530: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
e540: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
e550: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
e560: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
e570: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
e580: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
e590: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75  .int sqlite3Colu
e5a0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
e5b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e5c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
e5d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
e5e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
e5f0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
e600: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
e610: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
e620: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
e630: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
e640: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
e650: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
e660: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
e670: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
e680: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
e690: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
e6a0: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
e6b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e6c0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
e6d0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
e6e0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
e6f0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
e700: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e710: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20  unters */.  u32 
e720: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
e730: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e740: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
e750: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
e760: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
e770: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
e780: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
e790: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
e7a0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
e7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e7c0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e7d0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
e7e0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
e7f0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
e800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e810: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
e820: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
e830: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
e840: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
e850: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
e860: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
e870: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
e880: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e890: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
e8a0: 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8c0: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
e8d0: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
e8e0: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
e8f0: 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
e900: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
e910: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
e920: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
e930: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
e940: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
e950: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
e960: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
e970: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
e980: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
e990: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
e9a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
e9b0: 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20  ==(i16)nCol );. 
e9c0: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
e9d0: 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
e9e0: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
e9f0: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26  l=aCol; i<nCol &
ea00: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
ea10: 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  led; i++, pCol++
ea20: 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
ea30: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
ea40: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
ea50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
ea60: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
ea70: 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
ea80: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
ea90: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
eaa0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
eab0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
eac0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
ead0: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
eae0: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
eaf0: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
eb00: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  name */.    }els
eb10: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
eb20: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
eb30: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
eb40: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
eb50: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
eb60: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
eb70: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
eb80: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
eb90: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
eba0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
ebb0: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
ebc0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
ebd0: 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d        pColExpr =
ebe0: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
ebf0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
ec00: 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29  t( pColExpr!=0 )
ec10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ec20: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
ec30: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
ec40: 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30  ColExpr->pTab!=0
ec50: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
ec60: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
ec70: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
ec80: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
ec90: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
eca0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
ecb0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c       pTab = pCol
ecc0: 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
ecd0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
ece0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
ecf0: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
ed00: 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70  me = iCol>=0 ? p
ed10: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ed20: 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b  zName : "rowid";
ed30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ed40: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
ed50: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
ed60: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
ed70: 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70  Property(pColExp
ed80: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
ed90: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  );.        zName
eda0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a   = pColExpr->u.z
edb0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  Token;.      }el
edc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
edd0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
ede0: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
edf0: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
ee00: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
ee10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c       zName = pEL
ee20: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b  ist->a[i].zSpan;
ee30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ee40: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
ee50: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
ee60: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20  s", zName);..   
ee70: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
ee80: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
ee90: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
eea0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
eeb0: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
eec0: 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74 6f  nd an integer to
eed0: 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61   the name so tha
eee0: 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69  t it becomes uni
eef0: 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  que..    */.    
ef00: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  cnt = 0;.    whi
ef10: 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c  le( zName && sql
ef20: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 68 74  ite3HashFind(&ht
ef30: 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  , zName)!=0 ){. 
ef40: 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c       nName = sql
ef50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
ef60: 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  me);.      if( n
ef70: 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Name>0 ){.      
ef80: 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b    for(j=nName-1;
ef90: 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49   j>0 && sqlite3I
efa0: 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29  sdigit(zName[j])
efb0: 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20  ; j--){}.       
efc0: 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27   if( zName[j]=='
efd0: 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a  :' ) nName = j;.
efe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e        }.      zN
eff0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
f000: 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25  intf(db, "%.*z:%
f010: 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65  u", nName, zName
f020: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
f030: 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c 69  if( cnt>3 ) sqli
f040: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
f050: 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74  izeof(cnt), &cnt
f060: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  );.    }.    pCo
f070: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  l->zName = zName
f080: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ;.    sqlite3Col
f090: 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f  umnPropertiesFro
f0a0: 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a  mName(0, pCol);.
f0b0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26      if( zName &&
f0c0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
f0d0: 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70  rt(&ht, zName, p
f0e0: 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20  Col)==pCol ){.  
f0f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
f100: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  ult(db);.    }. 
f110: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
f120: 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69 66  Clear(&ht);.  if
f130: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f140: 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  ed ){.    for(j=
f150: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
f160: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f170: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
f180: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
f190: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f1a0: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
f1b0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
f1c0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
f1d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
f1e0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
f1f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f200: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65  ../*.** Add type
f210: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
f220: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20  nformation to a 
f230: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65  column list base
f240: 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54  d on.** a SELECT
f250: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a   statement..** .
f260: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
f270: 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61  st presumably ca
f280: 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f  me from selectCo
f290: 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70  lumnNamesFromExp
f2a0: 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20  rList()..** The 
f2b0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20  column list has 
f2c0: 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20  only names, not 
f2d0: 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69  types or collati
f2e0: 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ons.  This.** ro
f2f0: 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75  utine goes throu
f300: 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20  gh and adds the 
f310: 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
f320: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
f330: 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65   routine require
f340: 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74  s that all ident
f350: 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45  ifiers in the SE
f360: 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
f370: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  t be resolved..*
f380: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
f390: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
f3a0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20  eAndCollation(. 
f3b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f3c0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
f3d0: 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  g contexts */.  
f3e0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
f3f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c        /* Add col
f400: 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61  umn type informa
f410: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62  tion to this tab
f420: 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  le */.  Select *
f430: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a  pSelect       /*
f440: 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20   SELECT used to 
f450: 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20  determine types 
f460: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a  and collations *
f470: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
f480: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
f490: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
f4a0: 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  NC;.  Column *pC
f4b0: 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ol;.  CollSeq *p
f4c0: 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Coll;.  int i;. 
f4d0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75   Expr *p;.  stru
f4e0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
f4f0: 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c   *a;.  u64 szAll
f500: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
f510: 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20   pSelect!=0 );. 
f520: 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63   assert( (pSelec
f530: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
f540: 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b  _Resolved)!=0 );
f550: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
f560: 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e  >nCol==pSelect->
f570: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
f580: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f590: 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
f5a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
f5b0: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
f5c0: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
f5d0: 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
f5e0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
f5f0: 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
f600: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
f610: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
f620: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  pTab->aCol; i<pT
f630: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
f640: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  Col++){.    cons
f650: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
f660: 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20     int n, m;.   
f670: 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b   p = a[i].pExpr;
f680: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
f690: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
f6a0: 20 30 2c 20 30 2c 20 30 2c 20 26 70 43 6f 6c 2d   0, 0, 0, &pCol-
f6b0: 3e 73 7a 45 73 74 29 3b 0a 20 20 20 20 73 7a 41  >szEst);.    szA
f6c0: 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73  ll += pCol->szEs
f6d0: 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66  t;.    pCol->aff
f6e0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
f6f0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a  xprAffinity(p);.
f700: 20 20 20 20 69 66 28 20 7a 54 79 70 65 20 26 26      if( zType &&
f710: 20 28 6d 20 3d 20 73 71 6c 69 74 65 33 53 74 72   (m = sqlite3Str
f720: 6c 65 6e 33 30 28 7a 54 79 70 65 29 29 3e 30 20  len30(zType))>0 
f730: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ){.      n = sql
f740: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f  ite3Strlen30(pCo
f750: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
f760: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pCol->zName = s
f770: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
f780: 72 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  rFree(db, pCol->
f790: 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20  zName, n+m+2);. 
f7a0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a       if( pCol->z
f7b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
f7c0: 6d 65 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e  memcpy(&pCol->zN
f7d0: 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c  ame[n+1], zType,
f7e0: 20 6d 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70   m+1);.        p
f7f0: 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col->colFlags |=
f800: 20 43 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45   COLFLAG_HASTYPE
f810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f820: 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66      if( pCol->af
f830: 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c  finity==0 ) pCol
f840: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
f850: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
f860: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
f870: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
f880: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28  rse, p);.    if(
f890: 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e   pColl && pCol->
f8a0: 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  zColl==0 ){.    
f8b0: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
f8c0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
f8d0: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
f8e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
f8f0: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
f900: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a  sqlite3LogEst(sz
f910: 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  All*4);.}../*.**
f920: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
f930: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
f940: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
f950: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
f960: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
f970: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
f980: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
f990: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
f9a0: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
f9b0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
f9c0: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
f9d0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
f9e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
f9f0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
fa00: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
fa10: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
fa20: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
fa30: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
fa40: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
fa50: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
fa60: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
fa70: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
fa80: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
fa90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
faa0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
fab0: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
fac0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
fad0: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
fae0: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
faf0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
fb00: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
fb10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
fb20: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
fb30: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
fb40: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
fb50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
fb60: 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
fb70: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
fb80: 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
fb90: 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
fba0: 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
fbb0: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
fbc0: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
fbd0: 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20  e.bDisable );.  
fbe0: 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
fbf0: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
fc00: 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
fc10: 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
fc20: 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
fc30: 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
fc40: 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  76) );.  sqlite3
fc50: 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
fc60: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
fc70: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54  ect->pEList, &pT
fc80: 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
fc90: 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >aCol);.  sqlite
fca0: 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
fcb0: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
fcc0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
fcd0: 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d  Select);.  pTab-
fce0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69  >iPKey = -1;.  i
fcf0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
fd00: 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  led ){.    sqlit
fd10: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
fd20: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74  , pTab);.    ret
fd30: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
fd40: 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
fd50: 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f  ** Get a VDBE fo
fd60: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73  r the given pars
fd70: 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65  er context.  Cre
fd80: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
fd90: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49   necessary..** I
fda0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
fdb0: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  s, return NULL a
fdc0: 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61  nd leave a messa
fdd0: 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  ge in pParse..*/
fde0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
fdf0: 4f 49 4e 4c 49 4e 45 20 56 64 62 65 20 2a 61 6c  OINLINE Vdbe *al
fe00: 6c 6f 63 56 64 62 65 28 50 61 72 73 65 20 2a 70  locVdbe(Parse *p
fe10: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
fe20: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
fe30: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  e = sqlite3VdbeC
fe40: 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 20  reate(pParse);. 
fe50: 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33   if( v ) sqlite3
fe60: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
fe70: 5f 49 6e 69 74 2c 20 30 2c 20 31 29 3b 0a 20 20  _Init, 0, 1);.  
fe80: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
fe90: 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f  level==0.   && O
fea0: 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
feb0: 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
fec0: 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
fed0: 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50  nst).  ){.    pP
fee0: 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
fef0: 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  tor = 1;.  }.  r
ff00: 65 74 75 72 6e 20 76 3b 0a 7d 0a 56 64 62 65 20  eturn v;.}.Vdbe 
ff10: 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28  *sqlite3GetVdbe(
ff20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
ff30: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ff40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 65 74  se->pVdbe;.  ret
ff50: 75 72 6e 20 76 20 3f 20 76 20 3a 20 61 6c 6c 6f  urn v ? v : allo
ff60: 63 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 7d  cVdbe(pParse);.}
ff70: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
ff80: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
ff90: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
ffa0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
ffb0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
ffc0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
ffd0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
ffe0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
fff0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
10000 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
10010 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
10020 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
10030 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
10040 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
10050 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
10060 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
10070 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
10080 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
10090 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
100a0 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
100b0 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
100c0 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
100d0 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
100e0 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
100f0 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
10100 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
10110 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
10120 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
10130 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
10140 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
10150 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
10160 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
10170 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
10180 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
10190 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
101a0 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
101b0 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
101c0 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
101d0 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
101e0 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
101f0 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
10200 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
10210 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
10220 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
10230 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
10240 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
10250 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
10260 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
10270 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
10280 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
10290 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
102a0 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
102b0 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
102c0 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
102d0 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
102e0 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
102f0 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
10300 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72   if pLimit!=0 or
10310 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74   pOffset!=0 do t
10320 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
10330 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
10340 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
10350 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
10360 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
10370 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
10380 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
10390 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
103a0 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
103b0 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
103c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
103d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
103e0 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
103f0 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
10400 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
10410 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
10420 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
10430 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
10440 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
10450 20 69 6e 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d   int n;.  if( p-
10460 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
10470 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
10480 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
10490 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
104a0 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
104b0 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20   ** controversy 
104c0 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
104d0 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
104e0 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
104f0 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
10500 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
10510 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
10520 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
10530 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
10540 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
10550 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
10560 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
10570 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
10580 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
10590 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
105a0 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
105b0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
105c0 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
105d0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
105e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
105f0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
10600 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
10610 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
10620 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
10630 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10640 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
10650 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
10660 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10670 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
10680 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
10690 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
106a0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69  te3VdbeGoto(v, i
106b0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
106c0 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20  lse if( n>=0 && 
106d0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71  p->nSelectRow>sq
106e0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
106f0 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  )n) ){.        p
10700 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
10710 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
10720 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  4)n);.        p-
10730 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
10740 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20  FixedLimit;.    
10750 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
10760 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
10770 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
10780 70 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b  pLimit, iLimit);
10790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
107a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
107b0 75 73 74 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74  ustBeInt, iLimit
107c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
107d0 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
107e0 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
107f0 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
10800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10810 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp2(v, OP_IfNot
10820 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  , iLimit, iBreak
10830 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
10840 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  v);.    }.    if
10850 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a  ( p->pOffset ){.
10860 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
10870 20 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70   = iOffset = ++p
10880 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
10890 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
108a0 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
108b0 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
108c0 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
108d0 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  set */.      sql
108e0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
108f0 72 73 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c  rse, p->pOffset,
10900 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
10910 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10920 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
10930 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64  nt, iOffset); Vd
10940 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
10950 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10960 28 28 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75  ((v, "OFFSET cou
10970 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
10980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10990 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d  (v, OP_OffsetLim
109a0 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66  it, iLimit, iOff
109b0 73 65 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b  set+1, iOffset);
109c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
109d0 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46  nt((v, "LIMIT+OF
109e0 46 53 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20  FSET"));.    }. 
109f0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
10a00 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
10a10 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
10a20 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
10a30 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
10a40 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
10a50 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
10a60 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
10a70 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
10a80 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
10a90 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
10aa0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
10ab0 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
10ac0 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
10ad0 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
10ae0 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
10af0 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
10b00 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
10b10 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
10b20 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
10b30 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
10b40 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
10b50 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
10b60 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
10b70 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
10b80 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
10b90 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
10ba0 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
10bb0 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
10bc0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
10bd0 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
10be0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
10bf0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
10c00 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
10c10 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
10c20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10c30 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20  iCol>=0 );.  /* 
10c40 69 43 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73  iCol must be les
10c50 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74  s than p->pEList
10c60 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77  ->nExpr.  Otherw
10c70 69 73 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75  ise an error wou
10c80 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  ld.  ** have bee
10c90 6e 20 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20  n thrown during 
10ca0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
10cb0 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74  and we would not
10cc0 20 68 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a   have gotten.  *
10cd0 2a 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20  * this far */.  
10ce0 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41  if( pRet==0 && A
10cf0 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45  LWAYS(iCol<p->pE
10d00 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a  List->nExpr) ){.
10d10 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
10d20 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
10d30 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  arse, p->pEList-
10d40 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b  >a[iCol].pExpr);
10d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
10d60 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
10d70 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
10d80 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
10d90 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
10da0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
10db0 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e  ELECT.** with an
10dc0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
10dd0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
10de0 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65  allocates and re
10df0 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a  turns a KeyInfo.
10e00 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73 75 69  ** structure sui
10e10 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d  table for implem
10e20 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52  enting the ORDER
10e30 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65   BY..**.** Space
10e40 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
10e50 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
10e60 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
10e70 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c  malloc. The call
10e80 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
10e90 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
10ea0 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74  or ensuring that
10eb0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
10ec0 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  is eventually.**
10ed0 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69   freed..*/.stati
10ee0 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69  c KeyInfo *multi
10ef0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
10f00 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
10f10 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
10f20 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78  nt nExtra){.  Ex
10f30 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
10f40 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
10f50 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d    int nOrderBy =
10f60 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45   p->pOrderBy->nE
10f70 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr;.  sqlite3 *
10f80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10f90 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74  .  KeyInfo *pRet
10fa0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
10fb0 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65  oAlloc(db, nOrde
10fc0 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a  rBy+nExtra, 1);.
10fd0 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
10fe0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
10ff0 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
11000 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
11010 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11020 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72  em *pItem = &pOr
11030 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20  derBy->a[i];.   
11040 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d     Expr *pTerm =
11050 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
11060 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
11070 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  oll;..      if( 
11080 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
11090 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
110a0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
110b0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
110c0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a  pParse, pTerm);.
110d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
110e0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c       pColl = mul
110f0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
11100 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d  pParse, p, pItem
11110 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
11120 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l-1);.        if
11130 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f  ( pColl==0 ) pCo
11140 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
11150 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64  ll;.        pOrd
11160 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
11170 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   =.          sql
11180 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
11190 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
111a0 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a   pTerm, pColl->z
111b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
111c0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
111d0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
111e0 74 65 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a  teable(pRet) );.
111f0 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c        pRet->aCol
11200 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
11210 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f      pRet->aSortO
11220 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72  rder[i] = pOrder
11230 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
11240 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
11250 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
11260 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11270 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54  OMIT_CTE./*.** T
11280 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
11290 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20  rates VDBE code 
112a0 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
112b0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48  ontent of a WITH
112c0 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75   RECURSIVE.** qu
112d0 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a  ery of the form:
112e0 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73  .**.**   <recurs
112f0 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c  ive-table> AS (<
11300 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49  setup-query> UNI
11310 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73  ON [ALL] <recurs
11320 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20  ive-query>).**  
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11340 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
11350 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20  ___/            
11360 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
11370 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  _/.**           
11380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11390 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20  p->pPrior       
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
113b0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  .**.**.** There 
113c0 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72  is exactly one r
113d0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
113e0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
113f0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
11400 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69  se.** of recursi
11410 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64  ve-query, marked
11420 20 77 69 74 68 20 74 68 65 20 53 72 63 4c 69 73   with the SrcLis
11430 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75  t->a[].fg.isRecu
11440 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a  rsive flag..**.*
11450 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72  * The setup-quer
11460 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67  y runs once to g
11470 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69  enerate an initi
11480 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74  al set of rows t
11490 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61  hat go.** into a
114a0 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52   Queue table.  R
114b0 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ows are extracte
114c0 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65  d from the Queue
114d0 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a   table one by.**
114e0 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20   one.  Each row 
114f0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
11500 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74  ueue is output t
11510 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74  o pDest.  Then t
11520 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74  he single.** ext
11530 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20  racted row (now 
11540 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20  in the iCurrent 
11550 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74  table) becomes t
11560 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
11570 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74  e.** recursive-t
11580 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72  able for a recur
11590 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20  sive-query run. 
115a0 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   The output of t
115b0 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  he recursive-que
115c0 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62  ry.** is added b
115d0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ack into the Que
115e0 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20  ue table.  Then 
115f0 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65  another row is e
11600 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
11610 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  eue.** and the i
11620 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  teration continu
11630 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  es until the Que
11640 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  ue table is empt
11650 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
11660 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f  compound query o
11670 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
11680 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61   then no duplica
11690 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72  te rows are ever
116a0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
116b0 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
116c0 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63  e.  The iDistinc
116d0 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20  t table keeps a 
116e0 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73  copy of all rows
116f0 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76  .** that have ev
11700 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  er been inserted
11710 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20   into Queue and 
11720 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65  causes duplicate
11730 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61  s to be.** disca
11740 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70  rded.  If the op
11750 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
11760 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63  ALL, then duplic
11770 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ates are allowed
11780 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
11790 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44  query has an ORD
117a0 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72  ER BY, then entr
117b0 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  ies in the Queue
117c0 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20   table are kept 
117d0 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f  in.** ORDER BY o
117e0 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72  rder and the fir
117f0 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72  st entry is extr
11800 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63  acted for each c
11810 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a  ycle.  Without.*
11820 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  * an ORDER BY, t
11830 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
11840 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a  s just a FIFO..*
11850 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20  *.** If a LIMIT 
11860 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64  clause is provid
11870 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ed, then the ite
11880 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74  ration stops aft
11890 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a  er LIMIT rows.**
118a0 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75   have been outpu
118b0 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c  t to pDest.  A L
118c0 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61  IMIT of zero mea
118d0 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20  ns to output no 
118e0 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65  rows and a.** ne
118f0 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61  gative LIMIT mea
11900 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c  ns to output all
11910 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65   rows.  If there
11920 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53   is also an OFFS
11930 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74  ET clause.** wit
11940 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  h a positive val
11950 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ue, then the fir
11960 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74  st OFFSET output
11970 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  s are discarded 
11980 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62  rather.** than b
11990 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65  eing sent to pDe
119a0 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63  st.  The LIMIT c
119b0 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  ount does not be
119c0 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20  gin until after 
119d0 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68  OFFSET.** rows h
119e0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
119f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11a00 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
11a10 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50  ursiveQuery(.  P
11a20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
11a30 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
11a40 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
11a50 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
11a60 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73     /* The recurs
11a70 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65  ive SELECT to be
11a80 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
11a90 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
11aa0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
11ab0 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
11ac0 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  ts */.){.  SrcLi
11ad0 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
11ae0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
11af0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
11b00 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65  he recursive que
11b10 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ry */.  int nCol
11b20 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
11b30 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  xpr;  /* Number 
11b40 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
11b50 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  e recursive tabl
11b60 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
11b70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
11b80 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
11b90 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
11ba0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
11bb0 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
11bc0 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f  Setup = p->pPrio
11bd0 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75  r;   /* The setu
11be0 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  p query */.  int
11bf0 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
11c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
11c10 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  p of the loop */
11c20 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c  .  int addrCont,
11c30 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20   addrBreak;     
11c40 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64   /* CONTINUE and
11c50 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73   BREAK addresses
11c60 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65   */.  int iCurre
11c70 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
11c80 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65      /* The Curre
11c90 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
11ca0 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20  t regCurrent;   
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11cc0 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
11cd0 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
11ce0 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20  .  int iQueue;  
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d00 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61   /* The Queue ta
11d10 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69  ble */.  int iDi
11d20 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20  stinct = 0;     
11d30 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73         /* To ens
11d40 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c  ure unique resul
11d50 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20  ts if UNION */. 
11d60 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54   int eDest = SRT
11d70 5f 46 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  _Fifo;         /
11d80 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74  * How to write t
11d90 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c  o Queue */.  Sel
11da0 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75  ectDest destQueu
11db0 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
11dc0 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74  lectDest targett
11dd0 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61  ing the Queue ta
11de0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
11e10 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
11e20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
11e40 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78  ult code */.  Ex
11e50 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
11e60 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
11e70 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11e80 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  se */.  Expr *pL
11e90 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
11ea0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c        /* Saved L
11eb0 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
11ec0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
11ed0 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20  t, regOffset;   
11ee0 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
11ef0 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e  used by LIMIT an
11f00 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f  d OFFSET */..  /
11f10 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
11f20 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
11f30 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
11f40 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
11f50 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11f60 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
11f70 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
11f80 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
11f90 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
11fa0 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
11fb0 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
11fc0 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
11fd0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
11fe0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e  Label(v);.  p->n
11ff0 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b  SelectRow = 320;
12000 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72    /* 4 billion r
12010 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ows */.  compute
12020 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
12030 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72  Parse, p, addrBr
12040 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d  eak);.  pLimit =
12050 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f   p->pLimit;.  pO
12060 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
12070 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d  et;.  regLimit =
12080 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65   p->iLimit;.  re
12090 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  gOffset = p->iOf
120a0 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  fset;.  p->pLimi
120b0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  t = p->pOffset =
120c0 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20   0;.  p->iLimit 
120d0 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  = p->iOffset = 0
120e0 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
120f0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  ->pOrderBy;..  /
12100 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72  * Locate the cur
12110 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
12120 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
12130 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c  */.  for(i=0; AL
12140 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72  WAYS(i<pSrc->nSr
12150 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  c); i++){.    if
12160 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e  ( pSrc->a[i].fg.
12170 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
12180 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20       iCurrent = 
12190 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
121a0 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  or;.      break;
121b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
121c0 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
121d0 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75  s numbers for Qu
121e0 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74  eue and Distinct
121f0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
12200 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68  mber for.  ** th
12210 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65  e Distinct table
12220 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
12230 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
12240 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72  n Queue in order
12250 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52  .  ** for the SR
12260 54 5f 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53  T_DistFifo and S
12270 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73  RT_DistQueue des
12280 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72  tinations to wor
12290 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d  k. */.  iQueue =
122a0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
122b0 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
122c0 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44  _UNION ){.    eD
122d0 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
122e0 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a   SRT_DistQueue :
122f0 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20   SRT_DistFifo;. 
12300 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70     iDistinct = p
12310 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73   }else{.    eDes
12330 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53  t = pOrderBy ? S
12340 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46  RT_Queue : SRT_F
12350 69 66 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ifo;.  }.  sqlit
12360 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
12370 28 26 64 65 73 74 51 75 65 75 65 2c 20 65 44 65  (&destQueue, eDe
12380 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20  st, iQueue);..  
12390 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73  /* Allocate curs
123a0 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c  ors for Current,
123b0 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74   Queue, and Dist
123c0 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75  inct. */.  regCu
123d0 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65  rrent = ++pParse
123e0 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
123f0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12400 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43  P_OpenPseudo, iC
12410 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65  urrent, regCurre
12420 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28  nt, nCol);.  if(
12430 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12440 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
12450 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  fo = multiSelect
12460 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70  OrderByKeyInfo(p
12470 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20  Parse, p, 1);.  
12480 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12490 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
124a0 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
124b0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
124c0 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  +2, 0,.         
124d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
124e0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
124f0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64  _KEYINFO);.    d
12500 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42  estQueue.pOrderB
12510 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
12520 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
12530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12540 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
12550 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b  , iQueue, nCol);
12560 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65  .  }.  VdbeComme
12570 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20 74 61  nt((v, "Queue ta
12580 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44  ble"));.  if( iD
12590 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70  istinct ){.    p
125a0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
125b0 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  ] = sqlite3VdbeA
125c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
125d0 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74  Ephemeral, iDist
125e0 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d  inct, 0);.    p-
125f0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
12600 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
12610 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20   }..  /* Detach 
12620 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
12630 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d  use from the com
12640 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a  pound SELECT */.
12650 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
12660 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74  0;..  /* Store t
12670 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
12680 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e  e setup-query in
12690 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65   Queue. */.  pSe
126a0 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  tup->pNext = 0;.
126b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
126c0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
126d0 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
126e0 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  ;.  pSetup->pNex
126f0 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20  t = p;.  if( rc 
12700 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65  ) goto end_of_re
12710 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a  cursive_query;..
12720 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65    /* Find the ne
12730 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75  xt row in the Qu
12740 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74  eue and output t
12750 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64  hat row */.  add
12760 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
12770 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12780 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61  ewind, iQueue, a
12790 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
127a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f  overage(v);..  /
127b0 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e  * Transfer the n
127c0 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65  ext row in Queue
127d0 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74   over to Current
127e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
127f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
12800 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29  llRow, iCurrent)
12810 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f  ; /* To reset co
12820 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  lumn cache */.  
12830 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
12840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12850 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
12860 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64  mn, iQueue, pOrd
12870 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
12880 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65  egCurrent);.  }e
12890 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
128a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
128b0 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65  _RowData, iQueue
128c0 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
128d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
128e0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
128f0 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20  ete, iQueue);.. 
12900 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73   /* Output the s
12910 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
12920 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f  rent */.  addrCo
12930 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
12940 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
12950 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65  codeOffset(v, re
12960 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e  gOffset, addrCon
12970 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65  t);.  selectInne
12980 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
12990 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72   p->pEList, iCur
129a0 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30  rent,.      0, 0
129b0 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e  , pDest, addrCon
129c0 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  t, addrBreak);. 
129d0 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b   if( regLimit ){
129e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
129f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63  AddOp2(v, OP_Dec
12a00 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69  rJumpZero, regLi
12a10 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  mit, addrBreak);
12a20 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67  .    VdbeCoverag
12a30 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(v);.  }.  sqli
12a40 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12a50 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29  bel(v, addrCont)
12a60 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20  ;..  /* Execute 
12a70 74 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  the recursive SE
12a80 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20  LECT taking the 
12a90 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
12aa0 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68  rrent as.  ** th
12ab0 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
12ac0 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e  recursive-table.
12ad0 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
12ae0 74 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e  ts in the Queue.
12af0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
12b00 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
12b10 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71  regate ){.    sq
12b20 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
12b30 61 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65  arse, "recursive
12b40 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
12b50 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  es not supported
12b60 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
12b70 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
12b80 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
12b90 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
12ba0 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73  stQueue);.    as
12bb0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
12bc0 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  =0 );.    p->pPr
12bd0 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20  ior = pSetup;.  
12be0 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e  }..  /* Keep run
12bf0 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e  ning the loop un
12c00 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73  til the Queue is
12c10 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69   empty */.  sqli
12c20 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
12c30 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74  ddrTop);.  sqlit
12c40 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
12c50 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
12c60 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73  ;..end_of_recurs
12c70 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c  ive_query:.  sql
12c80 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
12c90 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
12ca0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
12cb0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
12cc0 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
12cd0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
12ce0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
12cf0 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
12d00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12d10 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
12d20 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
12d30 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
12d40 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
12d50 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
12d60 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12d70 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
12d80 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12d90 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12da0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
12db0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
12dc0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
12dd0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
12de0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
12df0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
12e00 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48  s */.);../*.** H
12e10 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61  andle the specia
12e20 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70  l case of a comp
12e30 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
12e40 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
12e50 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61   a.** VALUES cla
12e60 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e  use.  By handlin
12e70 67 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  g this as a spec
12e80 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f  ial case, we avo
12e90 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72  id deep.** recur
12ea0 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64  sion, and thus d
12eb0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e  o not need to en
12ec0 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45  force the SQLITE
12ed0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
12ee0 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56  SELECT.** on a V
12ef0 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a  ALUES clause..**
12f00 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20  .** Because the 
12f10 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72  Select object or
12f20 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20  iginates from a 
12f30 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a  VALUES clause:.*
12f40 2a 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e  *   (1) It has n
12f50 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45  o LIMIT or OFFSE
12f60 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74  T.**   (2) All t
12f70 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41  erms are UNION A
12f80 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72  LL.**   (3) Ther
12f90 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
12fa0 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69   clause.*/.stati
12fb0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
12fc0 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65  tValues(.  Parse
12fd0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12fe0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12ff0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
13000 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13010 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
13020 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
13030 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
13040 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
13050 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
13060 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
13070 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65  lts */.){.  Sele
13080 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e  ct *pPrior;.  in
13090 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e  t nRow = 1;.  in
130a0 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t rc = 0;.  asse
130b0 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
130c0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
130d0 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73  );.  do{.    ass
130e0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
130f0 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a   & SF_Values );.
13100 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
13110 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d  p==TK_ALL || (p-
13120 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26  >op==TK_SELECT &
13130 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20  & p->pPrior==0) 
13140 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
13150 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20  ->pLimit==0 );. 
13160 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
13170 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20  ffset==0 );.    
13180 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74  assert( p->pNext
13190 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74  ==0 || p->pEList
131a0 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78  ->nExpr==p->pNex
131b0 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
131c0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   );.    if( p->p
131d0 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b  Prior==0 ) break
131e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
131f0 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d  >pPrior->pNext==
13200 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  p );.    p = p->
13210 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77  pPrior;.    nRow
13220 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b  ++;.  }while(1);
13230 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
13240 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70     pPrior = p->p
13250 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50  Prior;.    p->pP
13260 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  rior = 0;.    rc
13270 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13280 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
13290 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  t);.    p->pPrio
132a0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
132b0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
132c0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
132d0 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20  w = nRow;.    p 
132e0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
132f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13300 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13310 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
13320 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75  process a compou
13330 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72  nd query form fr
13340 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72  om.** two or mor
13350 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69  e separate queri
13360 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20  es using UNION, 
13370 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50  UNION ALL, EXCEP
13380 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45  T, or.** INTERSE
13390 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69  CT.**.** "p" poi
133a0 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74  nts to the right
133b0 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f  -most of the two
133c0 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71   queries.  the q
133d0 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c  uery on the.** l
133e0 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72  eft is p->pPrior
133f0 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72  .  The left quer
13400 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20  y could also be 
13410 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
13420 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73  .** in which cas
13430 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
13440 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65  ill be called re
13450 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a  cursively. .**.*
13460 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66  * The results of
13470 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79   the total query
13480 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74   are to be writt
13490 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e  en into a destin
134a0 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65  ation.** of type
134b0 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61   eDest with para
134c0 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a  meter iParm..**.
134d0 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43  ** Example 1:  C
134e0 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d  onsider a three-
134f0 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c  way compound SQL
13500 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
13510 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
13520 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c  ROM t1 UNION SEL
13530 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e  ECT b FROM t2 UN
13540 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f  ION SELECT c FRO
13550 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  M t3.**.** This 
13560 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
13570 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77  sed up as follow
13580 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
13590 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a  ECT c FROM t3.**
135a0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
135b0 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  `----->  SELECT 
135c0 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20  b FROM t2.**    
135d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135f0 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54  `------>  SELECT
13600 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a   a FROM t1.**.**
13610 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74   The arrows in t
13620 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65  he diagram above
13630 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53   represent the S
13640 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69  elect.pPrior poi
13650 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74  nter..** So if t
13660 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13670 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75  alled with p equ
13680 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65  al to the t3 que
13690 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69  ry, then.** pPri
136a0 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74  or will be the t
136b0 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20  2 query.  p->op 
136c0 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e  will be TK_UNION
136d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
136e0 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74  *.** Notice that
136f0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
13700 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65  way SQLite parse
13710 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  s compound SELEC
13720 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  Ts, the.** indiv
13730 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c  idual selects al
13740 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20  ways group from 
13750 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a  left to right..*
13760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
13770 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73  tiSelect(.  Pars
13780 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
13790 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
137a0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
137b0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
137c0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
137d0 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
137e0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
137f0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
13800 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
13810 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
13820 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
13830 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13840 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f     /* Success co
13850 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75  de from a subrou
13860 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tine */.  Select
13870 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
13880 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
13890 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
138a0 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
138b0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
138c0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
138d0 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
138e0 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
138f0 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a  st dest;      /*
13900 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74   Alternative dat
13910 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  a destination */
13920 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65  .  Select *pDele
13930 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69  te = 0;  /* Chai
13940 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65  n of simple sele
13950 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  cts to delete */
13960 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
13970 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
13980 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13990 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
139a0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
139b0 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20   int iSub1 = 0; 
139c0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
139d0 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75   of left-hand qu
139e0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  ery */.  int iSu
139f0 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  b2 = 0;        /
13a00 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68  * EQP id of righ
13a10 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
13a20 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
13a30 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
13a40 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
13a50 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
13a60 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
13a70 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
13a80 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
13a90 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
13aa0 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
13ab0 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
13ac0 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
13ad0 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
13ae0 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
13af0 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
13b00 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
13b10 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73  .  assert( (p->s
13b20 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
13b30 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d  ursive)==0 || p-
13b40 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
13b50 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
13b60 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
13b70 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
13b80 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73  p->pPrior;.  des
13b90 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66  t = *pDest;.  if
13ba0 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
13bb0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
13bc0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13bd0 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  ,"ORDER BY claus
13be0 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
13bf0 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
13c00 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
13c10 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
13c20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
13c30 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
13c40 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  t_end;.  }.  if(
13c50 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
13c60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13c70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c  rorMsg(pParse,"L
13c80 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75  IMIT clause shou
13c90 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
13ca0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
13cb0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
13cc0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
13cd0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
13ce0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13cf0 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
13d00 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
13d10 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
13d20 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
13d30 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
13d40 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
13d50 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
13d60 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
13d70 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
13d80 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
13d90 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
13da0 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
13db0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
13dc0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
13dd0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
13de0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13df0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
13e00 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
13e10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
13e20 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
13e30 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
13e40 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61  .  /* Special ha
13e50 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d  ndling for a com
13e60 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
13e70 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20  t originates as 
13e80 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
13e90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
13ea0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
13eb0 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72  tiValue ){.    r
13ec0 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56  c = multiSelectV
13ed0 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c  alues(pParse, p,
13ee0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74   &dest);.    got
13ef0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13f00 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  nd;.  }..  /* Ma
13f10 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
13f20 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
13f30 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
13f40 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
13f50 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
13f60 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
13f70 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13f80 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
13f90 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
13fa0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
13fb0 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f  st->nExpr==pPrio
13fc0 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
13fd0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
13fe0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69  ITE_OMIT_CTE.  i
13ff0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
14000 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
14010 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74  .    generateWit
14020 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
14030 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
14040 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
14050 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  f..  /* Compound
14060 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
14070 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
14080 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
14090 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
140a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
140b0 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
140c0 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
140d0 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
140e0 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   pDest);.  }else
140f0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14100 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
14110 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
14120 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
14130 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
14140 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
14150 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
14160 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
14170 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
14180 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
14190 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
141a0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
141b0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
141c0 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
141d0 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
141e0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72  ffset;.      pPr
141f0 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d  ior->pLimit = p-
14200 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14210 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d  Prior->pOffset =
14220 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
14230 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14240 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
14250 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14260 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14270 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
14280 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
14290 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  st);.      p->pL
142a0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
142b0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
142c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
142d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
142e0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
142f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
14300 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
14310 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
14320 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
14330 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
14340 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
14350 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
14360 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
14370 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14380 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
14390 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74  IfNot, p->iLimit
143a0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
143b0 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
143c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
143d0 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
143e0 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
143f0 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66       if( p->iOff
14400 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
14410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14420 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
14430 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14450 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e    p->iLimit, p->
14460 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f  iOffset+1, p->iO
14470 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
14480 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14490 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
144a0 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
144b0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
144c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
144d0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
144e0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
144f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14510 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
14520 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
14530 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
14540 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  r;.      p->nSel
14550 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
14560 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
14570 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
14580 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
14590 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
145a0 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26  pLimit.       &&
145b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
145c0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
145d0 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  imit, &nLimit). 
145e0 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e        && nLimit>
145f0 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
14600 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow > sqlite3LogE
14610 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20  st((u64)nLimit) 
14620 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
14630 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
14640 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
14650 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20  (u64)nLimit);.  
14660 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14670 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
14680 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14690 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
146a0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
146b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
146c0 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
146d0 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
146e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
146f0 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
14700 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
14710 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14720 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
14730 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
14740 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
14750 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
14760 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
14770 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
14780 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
14790 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
147a0 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
147b0 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
147c0 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
147d0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
147e0 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
147f0 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
14800 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
14810 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
14820 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
14830 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
14840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14850 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
14860 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14870 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
14880 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
14890 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
148a0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
148b0 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
148c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
148d0 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
148e0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
148f0 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
14900 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
14910 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
14920 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
14930 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
14940 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
14950 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
14960 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
14970 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
14980 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
14990 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   );     /* Not a
149a0 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
149b0 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
149c0 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
149d0 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
149e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
149f0 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
14a00 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
14a10 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
14a20 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
14a30 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
14a40 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
14a50 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
14a60 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
14a70 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14a80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14a90 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
14aa0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
14ab0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14ac0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14ad0 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
14ae0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
14af0 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
14b00 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
14b10 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
14b20 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
14b30 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66   addr;.        f
14b40 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
14b50 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
14b60 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
14b70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14b80 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
14b90 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
14ba0 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
14bb0 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
14bc0 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
14bd0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
14be0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
14bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
14c00 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
14c10 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
14c20 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
14c30 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14c40 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
14c50 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14c60 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14c70 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
14c80 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
14c90 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
14ca0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14cb0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
14cc0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
14cd0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14ce0 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
14cf0 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
14d00 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14d10 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
14d20 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
14d30 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
14d40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14d50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
14d60 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
14d70 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
14d80 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
14d90 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
14da0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
14db0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
14dc0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
14dd0 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
14de0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
14df0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
14e00 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
14e10 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
14e20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
14e30 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
14e40 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
14e50 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
14e60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
14e70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
14e80 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
14e90 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14ea0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
14eb0 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
14ec0 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
14ed0 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
14ee0 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
14ef0 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
14f00 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
14f10 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
14f20 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
14f30 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
14f40 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
14f50 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
14f60 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
14f70 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
14f80 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14f90 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14fa0 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
14fb0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
14fc0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
14fe0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
14ff0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
15000 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
15010 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
15020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15030 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
15040 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
15050 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
15060 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
15070 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
15080 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
15090 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
150a0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
150b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
150c0 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
150d0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
150e0 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
150f0 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
15100 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
15110 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
15120 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
15130 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
15140 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
15150 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
15160 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
15170 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
15180 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
15190 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
151a0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
151b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
151c0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
151d0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
151e0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
151f0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
15200 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
15210 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
15220 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
15230 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
15240 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
15250 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
15260 6d 65 73 28 70 50 61 72 73 65 2c 20 70 46 69 72  mes(pParse, pFir
15270 73 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74  st->pSrc, pFirst
15280 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
15290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
152a0 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
152b0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
152c0 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
152d0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
152e0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
152f0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
15300 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
15310 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15320 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15330 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
15340 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
15350 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
15360 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53  e(v);.        iS
15370 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
15380 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15390 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
153a0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
153b0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
153c0 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153e0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
153f0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
15400 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15410 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
15420 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
15430 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15440 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15450 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
15460 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15470 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
15480 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15490 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
154a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
154b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
154c0 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
154d0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
154e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
154f0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
15500 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
15510 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
15520 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
15530 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
15540 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
15550 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
15560 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
15570 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
15580 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
15590 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
155a0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
155b0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
155c0 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
155d0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
155e0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
155f0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
15600 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15610 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
15620 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
15630 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
15640 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
15650 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
15660 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
15670 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
15680 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15690 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
156a0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
156b0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
156c0 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
156d0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
156e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
156f0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
15700 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
15710 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
15720 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
15730 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
15740 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
15750 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
15760 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
15770 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
15780 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
15790 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
157a0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
157b0 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
157c0 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
157d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
157e0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
157f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15800 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
15810 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
15820 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
15830 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15840 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
15850 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15860 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15870 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15880 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
15890 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
158a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
158b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
158c0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
158d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
158e0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
158f0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
15900 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
15910 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
15920 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15930 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15940 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15950 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
15960 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15970 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
15980 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
15990 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
159a0 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
159b0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
159c0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
159d0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
159e0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
159f0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
15a00 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
15a10 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
15a20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
15a30 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
15a40 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
15a50 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
15a60 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15a70 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
15a80 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
15a90 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
15aa0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
15ab0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
15ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15ad0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
15ae0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
15af0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
15b00 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
15b10 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
15b20 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
15b30 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
15b40 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
15b50 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
15b60 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
15b70 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
15b80 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
15b90 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
15ba0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
15bb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
15bc0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
15bd0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
15be0 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
15bf0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
15c00 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
15c10 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
15c20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
15c30 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
15c40 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
15c50 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
15c60 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
15c70 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
15c80 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
15c90 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
15ca0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
15cb0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
15cc0 73 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74  s(pParse, pFirst
15cd0 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e  ->pSrc, pFirst->
15ce0 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
15cf0 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
15d00 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15d10 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
15d20 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
15d30 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15d40 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
15d50 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
15d60 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
15d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15d80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
15d90 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
15da0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
15db0 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  e(v);.      r1 =
15dc0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15dd0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
15de0 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
15df0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15e00 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31  OP_RowData, tab1
15e10 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
15e20 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
15e30 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
15e40 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
15e50 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  1, 0); VdbeCover
15e60 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71  age(v);.      sq
15e70 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15e80 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
15e90 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
15ea0 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
15eb0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62  , p->pEList, tab
15ec0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
15ed0 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
15ee0 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
15ef0 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
15f00 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15f10 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
15f20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15f30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
15f40 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
15f50 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15f60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15f70 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15f80 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
15f90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15fa0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
15fb0 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
15fc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15fd0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
15fe0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
15ff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16000 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
16010 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
16020 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
16030 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
16040 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
16050 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
16060 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
16070 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
16080 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
16090 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
160a0 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
160b0 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
160c0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
160d0 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
160e0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
160f0 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
16100 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
16110 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
16120 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
16130 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
16140 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
16150 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
16160 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
16170 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
16180 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
16190 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
161a0 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
161b0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
161c0 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
161d0 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
161e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
161f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
16200 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
16210 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
16240 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
16250 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
16260 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
16270 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
16280 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
16290 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
162a0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
162b0 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
162c0 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
162d0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
162e0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
162f0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
16300 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
16310 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
16320 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
16330 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
16360 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
16370 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
16380 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  t( p->pNext==0 )
16390 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e  ;.    nCol = p->
163a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
163b0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
163c0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
163d0 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a  c(db, nCol, 1);.
163e0 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e 66      if( !pKeyInf
163f0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
16400 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
16410 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  T;.      goto mu
16420 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
16430 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
16440 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
16450 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
16460 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
16470 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
16480 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
16490 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
164a0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
164b0 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
164c0 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
164d0 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
164e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
164f0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
16500 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
16510 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
16520 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
16530 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
16540 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
16550 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
16560 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
16570 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
16580 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
16590 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
165a0 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
165b0 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
165c0 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
165d0 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
165e0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
165f0 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
16600 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
16610 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
16620 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
16630 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
16640 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
16650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
16660 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
16670 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
16680 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
16690 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
166a0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
166b0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
166c0 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
166f0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72       pLoop->addr
16700 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31  OpenEphm[i] = -1
16710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16720 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
16730 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
16740 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
16750 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
16760 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  t->iSdst = dest.
16770 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  iSdst;.  pDest->
16780 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64  nSdst = dest.nSd
16790 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  st;.  sqlite3Sel
167a0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
167b0 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
167c0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
167d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
167e0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
167f0 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73  ./*.** Error mes
16800 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74 77  sage for when tw
16810 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 20  o or more terms 
16820 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
16830 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65 72  lect have differ
16840 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75  ent.** size resu
16850 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64  lt sets..*/.void
16860 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72   sqlite3SelectWr
16870 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72  ongNumTermsError
16880 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
16890 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66  Select *p){.  if
168a0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
168b0 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20  SF_Values ){.   
168c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
168d0 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41  (pParse, "all VA
168e0 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74  LUES must have t
168f0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
16900 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c  f terms");.  }el
16910 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
16920 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16930 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
16940 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
16950 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64 6f  f %s".      " do
16960 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61   not have the sa
16970 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  me number of res
16980 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65  ult columns", se
16990 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
169a0 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ));.  }.}../*.**
169b0 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20   Code an output 
169c0 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  subroutine for a
169d0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65   coroutine imple
169e0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a  mentation of a.*
169f0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e  * SELECT statmen
16a00 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74  t..**.** The dat
16a10 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69  a to be output i
16a20 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70  s contained in p
16a30 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72  In->iSdst.  Ther
16a40 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53  e are.** pIn->nS
16a50 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  dst columns to b
16a60 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
16a70 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
16a80 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
16a90 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
16aa0 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
16ab0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
16ac0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
16ad0 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
16ae0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
16af0 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
16b00 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  >0 then it is th
16b10 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
16b20 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61   in a vector tha
16b30 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65  t.** records the
16b40 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
16b50 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20  .  mem[regPrev] 
16b60 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  is a flag that i
16b70 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68  s false.** if th
16b80 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20  ere has been no 
16b90 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
16ba0 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74    If regPrev>0 t
16bb0 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67  hen code is.** g
16bc0 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70  enerated to supp
16bd0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e  ress duplicates.
16be0 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73    pKeyInfo is us
16bf0 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  ed for comparing
16c00 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20  .** keys..**.** 
16c10 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75  If the LIMIT fou
16c20 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20  nd in p->iLimit 
16c30 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70  is reached, jump
16c40 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a   immediately to.
16c50 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74  ** iBreak..*/.st
16c60 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74  atic int generat
16c70 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
16c80 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
16c90 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
16ca0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
16cb0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16cd0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
16ce0 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
16cf0 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20  Dest *pIn,      
16d00 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73    /* Coroutine s
16d10 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f  upplying data */
16d20 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
16d30 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68  Dest,      /* Wh
16d40 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20  ere to send the 
16d50 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65  data */.  int re
16d60 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20  gReturn,        
16d70 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
16d80 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  address register
16d90 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
16da0 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v,            /*
16db0 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74   Previous result
16dc0 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75   register.  No u
16dd0 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a  niqueness if 0 *
16de0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
16df0 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46  yInfo,      /* F
16e00 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74  or comparing wit
16e10 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  h previous entry
16e20 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e40 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77 65   Jump here if we
16e50 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20 2a   hit the LIMIT *
16e60 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
16e70 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
16e80 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b    int iContinue;
16e90 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20  .  int addr;..  
16ea0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
16eb0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16ec0 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20  ;.  iContinue = 
16ed0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16ee0 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53  abel(v);..  /* S
16ef0 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74  uppress duplicat
16f00 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58  es for UNION, EX
16f10 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52 53  CEPT, and INTERS
16f20 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ECT .  */.  if( 
16f30 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20 69  regPrev ){.    i
16f40 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b  nt addr1, addr2;
16f50 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c  .    addr1 = sql
16f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16f70 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
16f80 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rev); VdbeCovera
16f90 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72 32  ge(v);.    addr2
16fa0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16fb0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
16fc0 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  re, pIn->iSdst, 
16fd0 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
16fe0 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20  nSdst,.         
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
17010 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
17020 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
17030 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
17040 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17050 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c  P_Jump, addr2+2,
17060 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72   iContinue, addr
17070 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  2+2); VdbeCovera
17080 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge(v);.    sqlit
17090 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
170a0 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
170b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
170c0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d  v, OP_Copy, pIn-
170d0 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
170e0 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29  1, pIn->nSdst-1)
170f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17100 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
17110 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65  teger, 1, regPre
17120 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
17130 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
17140 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
17150 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  0;..  /* Suppres
17160 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  s the first OFFS
17170 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
17180 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
17190 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
171a0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
171b0 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
171c0 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ue);..  assert( 
171d0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
171e0 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61 73  T_Exists );.  as
171f0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
17200 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st!=SRT_Table );
17210 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73 74  .  switch( pDest
17220 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ->eDest ){.    /
17230 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
17240 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
17250 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
17260 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
17270 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
17280 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
17290 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
172a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
172b0 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
172c0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
172d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
172e0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
172f0 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
17300 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17310 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  dst, r1);.      
17320 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17330 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
17340 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
17350 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
17360 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
17370 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
17380 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
17390 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
173a0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
173b0 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
173c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
173d0 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
173e0 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
173f0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
17400 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
17410 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
17420 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
17430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
17440 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
17450 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
17460 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
17470 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
17480 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
17490 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
174a0 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
174b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 49      testcase( pI
174c0 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20  n->nSdst>1 );.  
174d0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
174e0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
174f0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
17500 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17510 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
17520 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
17530 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20 20  Sdst, .         
17540 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66   r1, pDest->zAff
17550 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17570 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
17580 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
17590 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
175a0 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
175b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
175c0 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
175d0 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
175e0 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20 20  arm, r1,.       
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17600 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20      pIn->iSdst, 
17610 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
17620 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17630 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17640 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
17650 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
17660 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63   If this is a sc
17670 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74  alar select that
17680 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   is part of an e
17690 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a  xpression, then.
176a0 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65      ** store the
176b0 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
176c0 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f  appropriate memo
176d0 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61  ry cell and brea
176e0 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20  k out.    ** of 
176f0 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20  the scan loop.. 
17700 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
17710 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
17720 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64  assert( pIn->nSd
17730 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d  st==1 || pParse-
17740 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73 74  >nErr>0 );  test
17750 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
17760 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=1 );.      sql
17770 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
17780 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
17790 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
177a0 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
177b0 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
177c0 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
177d0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
177e0 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
177f0 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
17800 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
17810 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
17820 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
17830 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
17840 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
17850 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
17860 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
17870 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
17880 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
17890 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
178a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
178b0 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
178c0 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
178d0 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
178e0 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
178f0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17900 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
17910 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
17920 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
17930 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
17940 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
17950 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
17960 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
17970 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
17980 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17990 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
179a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
179b0 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
179c0 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
179d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
179e0 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62  f none of the ab
179f0 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65  ove, then the re
17a00 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e  sult destination
17a10 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20   must be.    ** 
17a20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69  SRT_Output.  Thi
17a30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
17a40 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  er called with a
17a50 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ny other.    ** 
17a60 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65  destination othe
17a70 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20  r than the ones 
17a80 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72  handled above or
17a90 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20   SRT_Output..   
17aa0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53   **.    ** For S
17ab0 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c  RT_Output, resul
17ac0 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
17ad0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
17ae0 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20  egisters.  .    
17af0 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52  ** Then the OP_R
17b00 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20  esultRow opcode 
17b10 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65  is used to cause
17b20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
17b30 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  to.    ** return
17b40 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66   the next row of
17b50 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a   result..    */.
17b60 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
17b70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
17b80 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
17b90 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73  utput );.      s
17ba0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17bb0 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
17bc0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
17bd0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17be0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17bf0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
17c00 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17c10 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
17c20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
17c30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75    }.  }..  /* Ju
17c40 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  mp to the end of
17c50 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65   the loop if the
17c60 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65   LIMIT is reache
17c70 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
17c80 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
17c90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17ca0 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
17cb0 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
17cc0 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
17cd0 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20  erage(v);.  }.. 
17ce0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
17cf0 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
17d00 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
17d10 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
17d20 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  l(v, iContinue);
17d30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17d40 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
17d50 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a  n, regReturn);..
17d60 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
17d70 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
17d80 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  ive compound sel
17d90 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ect code generat
17da0 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  or for cases whe
17db0 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e  n there.** is an
17dc0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17dd0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
17de0 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  e a query of the
17df0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a   following form:
17e00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c  .**.**      <sel
17e10 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72  ectA>  <operator
17e20 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52  >  <selectB>  OR
17e30 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c  DER BY <orderbyl
17e40 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72  ist>.**.** <oper
17e50 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20  ator> is one of 
17e60 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e  UNION ALL, UNION
17e70 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54  , EXCEPT, or INT
17e80 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65  ERSECT.  The ide
17e90 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20  a.** is to code 
17ea0 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61  both <selectA> a
17eb0 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74  nd <selectB> wit
17ec0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
17ed0 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72  lause as.** co-r
17ee0 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72  outines.  Then r
17ef0 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  un the co-routin
17f00 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61  es in parallel a
17f10 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73  nd merge the res
17f20 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  ults.** into the
17f30 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64   output.  In add
17f40 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f  ition to the two
17f50 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c   coroutines (cal
17f60 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a  led selectA and.
17f70 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72  ** selectB) ther
17f80 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69  e are 7 subrouti
17f90 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  nes:.**.**    ou
17fa0 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tA:    Move the 
17fb0 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
17fc0 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20  lectA coroutine 
17fd0 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
17fe0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
17ff0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
18000 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  uery..**.**    o
18010 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utB:    Move the
18020 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
18030 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65  electB coroutine
18040 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
18050 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18060 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
18070 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65  query.  (Only ge
18080 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f  nerated for UNIO
18090 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  N and.**        
180a0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20       UNION ALL. 
180b0 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45   EXCEPT and INSE
180c0 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74  RTSECT never out
180d0 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a  put a row that.*
180e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70  *             ap
180f0 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e  pears only in B.
18100 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a  ).**.**    AltB:
18110 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
18120 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
18130 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
18140 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a  es and A<B..**.*
18150 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61  *    AeqB:    Ca
18160 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
18170 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
18180 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
18190 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   A==B..**.**    
181a0 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AgtB:    Called 
181b0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
181c0 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
181d0 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e  outines and A>B.
181e0 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  .**.**    EofA: 
181f0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
18200 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
18210 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a   from selectA..*
18220 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20  *.**    EofB:   
18230 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74   Called when dat
18240 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66  a is exhausted f
18250 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a  rom selectB..**.
18260 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
18270 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74  ation of the lat
18280 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74  ter five subrout
18290 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77  ines depend on w
182a0 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74  hich .** <operat
182b0 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a  or> is used:.**.
182c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
182d0 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20    UNION ALL     
182e0 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20      UNION       
182f0 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20       EXCEPT     
18300 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a       INTERSECT.*
18310 2a 20 20 20 20 20 20 20 20 20 20 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 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
18340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d  -----------  ---
18350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
18360 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41  *   AltB:   outA
18370 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
18380 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
18390 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
183a0 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20     nextA.**.**  
183b0 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AeqB:   outA, n
183c0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
183d0 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  tA             n
183e0 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74  extA         out
183f0 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20  A, nextA.**.**  
18400 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e   AgtB:   outB, n
18410 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20  extB      outB, 
18420 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e  nextB          n
18430 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20  extB            
18440 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f  nextB.**.**   Eo
18450 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  fA:   outB, next
18460 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
18470 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74  tB          halt
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c               hal
18490 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20  t.**.**   EofB: 
184a0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
184b0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
184c0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
184d0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
184e0 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c  .** In the AltB,
184f0 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20   AeqB, and AgtB 
18500 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20  subroutines, an 
18510 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69  EOF on A followi
18520 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73  ng nextA.** caus
18530 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
18540 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64  jump to EofA and
18550 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c   an EOF on B fol
18560 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75  lowing nextB cau
18570 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69  ses.** an immedi
18580 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42  ate jump to EofB
18590 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61  .  Within EofA a
185a0 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46  nd EofB, and EOF
185b0 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20   on entry or.** 
185c0 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20  following nextX 
185d0 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f  causes a jump to
185e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
185f0 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e  select processin
18600 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61  g..**.** Duplica
18610 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68  te removal in th
18620 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  e UNION, EXCEPT,
18630 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63   and INTERSECT c
18640 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ases is handled.
18650 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75  ** within the ou
18660 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e  tput subroutine.
18670 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65    The regPrev re
18680 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73  gister set holds
18690 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a   the previously.
186a0 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e  ** output value.
186b0 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69    A comparison i
186c0 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74  s made against t
186d0 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68  his value and th
186e0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73  e output.** is s
186f0 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65  kipped if the ne
18700 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64  xt results would
18710 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
18720 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a  the previous..**
18730 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
18740 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74  tation plan is t
18750 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
18760 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  two coroutines a
18770 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72  nd seven.** subr
18780 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74  outines first, t
18790 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74  hen put the cont
187a0 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65  rol logic at the
187b0 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74   bottom.  Like t
187c0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
187d0 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a      goto Init.**
187e0 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74       coA: corout
187f0 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65  ine for left que
18800 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f  ry (A).**     co
18810 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  B: coroutine for
18820 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29   right query (B)
18830 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74  .**    outA: out
18840 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41  put one row of A
18850 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74  .**    outB: out
18860 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42  put one row of B
18870 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f   (UNION and UNIO
18880 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20  N ALL only).**  
18890 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofA: ....**  
188a0 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    EofB: ....**  
188b0 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AltB: ....**  
188c0 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AeqB: ....**  
188d0 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20    AgtB: ....**  
188e0 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69    Init: initiali
188f0 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67  ze coroutine reg
18900 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20  isters.**       
18910 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20     yield coA.** 
18920 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
18930 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20  A) goto EofA.** 
18940 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
18950 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oB.**          i
18960 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f  f eof(B) goto Eo
18970 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43  fB.**    Cmpr: C
18980 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20  ompare A, B.**  
18990 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74          Jump Alt
189a0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a  B, AeqB, AgtB.**
189b0 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a       End: ....**
189c0 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42  .** We call AltB
189d0 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f  , AeqB, AgtB, Eo
189e0 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75  fA, and EofB "su
189f0 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74  broutines" but t
18a00 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  hey are not.** a
18a10 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75  ctually called u
18a20 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74  sing Gosub and t
18a30 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72  hey do not Retur
18a40 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  n.  EofA and Eof
18a50 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20  B loop.** until 
18a60 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61  all data is exha
18a70 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20  usted then jump 
18a80 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62  to the "end" lab
18a90 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a  e.  AltB, AeqB,.
18aa0 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70  ** and AgtB jump
18ab0 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72   to either L2 or
18ac0 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20   to one of EofA 
18ad0 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e  or EofB..*/.#ifn
18ae0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18af0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
18b00 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
18b10 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
18b20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18b30 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18b40 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
18b50 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
18b60 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
18b70 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
18b80 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
18b90 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
18ba0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
18bb0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
18bc0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
18bd0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
18be0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
18bf0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65  counters */.  Se
18c00 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
18c10 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
18c20 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
18c30 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
18c40 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
18c50 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
18c60 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
18c70 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
18c80 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20  ctDest destA;   
18c90 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
18ca0 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41   for coroutine A
18cb0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
18cc0 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44   destB;     /* D
18cd0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
18ce0 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20  oroutine B */.  
18cf0 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20  int regAddrA;   
18d00 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
18d10 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
18d20 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
18d30 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
18d40 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rB;         /* A
18d50 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
18d60 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  for select-B cor
18d70 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18d80 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20  addrSelectA;    
18d90 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18da0 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  the select-A cor
18db0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18dc0 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20  addrSelectB;    
18dd0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18de0 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72  the select-B cor
18df0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18e00 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20  regOutA;        
18e10 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
18e20 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75  ister for the ou
18e30 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
18e40 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
18e50 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tB;          /* 
18e60 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
18e70 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
18e80 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18e90 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20    int addrOutA; 
18ea0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18eb0 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  ss of the output
18ec0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
18ed0 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20  .  int addrOutB 
18ee0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  = 0;     /* Addr
18ef0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
18f00 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
18f10 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41  /.  int addrEofA
18f20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
18f30 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
18f40 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73  ct-A-exhausted s
18f50 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18f60 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b  nt addrEofA_noB;
18f70 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74       /* Alternat
18f80 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42 20  e addrEofA if B 
18f90 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  is uninitialized
18fa0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
18fb0 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fB;         /* A
18fc0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
18fd0 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65 64  lect-B-exhausted
18fe0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18ff0 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20 20   int addrAltB;  
19000 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19010 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75 62  s of the A<B sub
19020 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19030 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20 20   addrAeqB;      
19040 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19050 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f 75   the A==B subrou
19060 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19070 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20 20  drAgtB;         
19080 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19090 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e 65  e A>B subroutine
190a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
190b0 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  itA;        /* L
190c0 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f  imit register fo
190d0 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20  r select-A */.  
190e0 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20 20  int regLimitB;  
190f0 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
19100 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
19110 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
19120 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  gPrev;          
19130 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72 65  /* A range of re
19140 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64 20  gisters to hold 
19150 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 20  previous output 
19160 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c 69  */.  int savedLi
19170 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  mit;       /* Sa
19180 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  ved value of p->
19190 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  iLimit */.  int 
191a0 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20 20  savedOffset;    
191b0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
191c0 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a   of p->iOffset *
191d0 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70  /.  int labelCmp
191e0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  r;        /* Lab
191f0 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72 74  el for the start
19200 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61 6c   of the merge al
19210 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74  gorithm */.  int
19220 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20 20   labelEnd;      
19230 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20     /* Label for 
19240 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
19250 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73 74  verall SELECT st
19260 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  mt */.  int addr
19270 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
19280 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   Jump instructio
19290 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74 61  ns that get reta
192a0 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74  rgetted */.  int
192b0 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
192c0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
192d0 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  ALL, TK_UNION, T
192e0 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54  K_EXCEPT, TK_INT
192f0 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49  ERSECT */.  KeyI
19300 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20 30  nfo *pKeyDup = 0
19310 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20  ; /* Comparison 
19320 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
19330 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  duplicate remova
19340 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  l */.  KeyInfo *
19350 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20  pKeyMerge;   /* 
19360 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
19370 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69  mation for mergi
19380 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c  ng rows */.  sql
19390 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
193a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
193b0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45  onnection */.  E
193c0 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
193d0 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y;   /* The ORDE
193e0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
193f0 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20 20   int nOrderBy;  
19400 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19410 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
19420 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19430 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d   */.  int *aPerm
19440 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d  ute;        /* M
19450 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45  apping from ORDE
19460 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72 65  R BY terms to re
19470 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
19480 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
19490 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
194a0 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20    int iSub1;    
194b0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
194c0 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
194d0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
194e0 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub2;            
194f0 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
19500 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
19510 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
19520 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d  t( p->pOrderBy!=
19530 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19540 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20  KeyDup==0 ); /* 
19550 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e  "Managed" code n
19560 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b  eeds this.  Tick
19570 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64  et #3382. */.  d
19580 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
19590 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
195a0 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
195b0 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20  !=0 );       /* 
195c0 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74  Already thrown t
195d0 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42 45  he error if VDBE
195e0 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f   alloc failed */
195f0 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71  .  labelEnd = sq
19600 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19610 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d  el(v);.  labelCm
19620 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pr = sqlite3Vdbe
19630 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a  MakeLabel(v);...
19640 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68    /* Patch up th
19650 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19660 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d  e.  */.  op = p-
19670 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20  >op;  .  pPrior 
19680 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61  = p->pPrior;.  a
19690 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
196a0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
196b0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
196c0 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74  rderBy;.  assert
196d0 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ( pOrderBy );.  
196e0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
196f0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f  rBy->nExpr;..  /
19700 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20  * For operators 
19710 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
19720 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20   ALL we have to 
19730 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
19740 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
19750 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65   clause covers e
19760 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65  very term of the
19770 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64   result set.  Ad
19780 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20  d.  ** terms to 
19790 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
197a0 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79  use as necessary
197b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21  ..  */.  if( op!
197c0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66  =TK_ALL ){.    f
197d0 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c  or(i=1; db->mall
197e0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69  ocFailed==0 && i
197f0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
19800 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
19810 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
19820 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
19830 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
19840 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a  m=pOrderBy->a; j
19850 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20  <nOrderBy; j++, 
19860 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
19870 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
19880 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19890 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
198a0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
198b0 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72  derByCol==i ) br
198c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
198d0 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72     if( j==nOrder
198e0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  By ){.        Ex
198f0 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
19900 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
19910 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20  TEGER, 0);.     
19920 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
19930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
19940 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
19950 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
19960 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
19970 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
19980 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20  Value = i;.     
19990 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
199a0 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69   pOrderBy = sqli
199b0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
199c0 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  d(pParse, pOrder
199d0 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  By, pNew);.     
199e0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
199f0 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f  ) pOrderBy->a[nO
19a00 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f  rderBy++].u.x.iO
19a10 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
19a20 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )i;.      }.    
19a30 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  }.  }..  /* Comp
19a40 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ute the comparis
19a50 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61  on permutation a
19a60 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20  nd keyinfo that 
19a70 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a  is used with.  *
19a80 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f  * the permutatio
19a90 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  n used to determ
19aa0 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a  ine if the next.
19ab0 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75    ** row of resu
19ac0 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73  lts comes from s
19ad0 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74  electA or select
19ae0 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70  B.  Also add exp
19af0 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  licit.  ** colla
19b00 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44  tions to the ORD
19b10 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
19b20 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20  ms so that when 
19b30 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 20  the subqueries. 
19b40 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74   ** to the right
19b50 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72   and the left ar
19b60 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65  e evaluated, the
19b70 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65 63  y use the correc
19b80 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e  t.  ** collation
19b90 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74  ..  */.  aPermut
19ba0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
19bb0 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
19bc0 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72  eof(int)*(nOrder
19bd0 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20  By + 1));.  if( 
19be0 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
19bf0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
19c00 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
19c10 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e   aPermute[0] = n
19c20 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72  OrderBy;.    for
19c30 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=1, pItem=pOrd
19c40 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64  erBy->a; i<=nOrd
19c50 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  erBy; i++, pItem
19c60 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
19c70 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
19c80 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
19c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
19ca0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
19cb0 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
19cc0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
19cd0 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
19ce0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
19cf0 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
19d00 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d     pKeyMerge = m
19d10 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
19d20 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
19d30 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b   p, 1);.  }else{
19d40 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
19d50 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
19d60 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
19d70 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
19d80 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
19d90 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
19da0 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
19db0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
19dc0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
19dd0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
19de0 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
19df0 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
19e00 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
19e10 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
19e20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
19e30 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
19e40 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
19e50 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
19e60 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
19e70 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
19e80 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
19e90 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
19ea0 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
19eb0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
19ec0 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
19ed0 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
19ee0 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
19ef0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
19f00 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
19f10 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
19f20 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
19f30 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
19f40 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
19f50 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
19f60 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b  ->nMem += nExpr+
19f70 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
19f80 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
19f90 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
19fa0 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
19fb0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
19fc0 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
19fd0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
19fe0 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61  eyDup ){.      a
19ff0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
1a000 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
1a010 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20  (pKeyDup) );.   
1a020 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
1a030 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
1a040 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
1a050 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
1a060 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
1a070 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
1a080 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
1a090 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
1a0a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1a0b0 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
1a0c0 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
1a0d0 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
1a0e0 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
1a0f0 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
1a100 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  0;.  pPrior->pNe
1a110 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  xt = 0;.  sqlite
1a120 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
1a130 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
1a140 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
1a150 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
1a160 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
1a170 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
1a180 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
1a190 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1a1a0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1a1b0 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
1a1c0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
1a1d0 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
1a1e0 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
1a1f0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
1a200 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
1a210 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
1a220 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
1a230 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
1a240 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1a250 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
1a260 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
1a270 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
1a280 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a290 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
1a2a0 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
1a2b0 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
1a2f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a300 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
1a310 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
1a320 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
1a330 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
1a340 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
1a350 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1a360 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
1a370 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
1a380 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
1a390 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
1a3a0 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e  >pOffset);.  p->
1a3b0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  pOffset = 0;..  
1a3c0 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
1a3d0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1a3e0 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
1a3f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
1a400 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1a410 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
1a420 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a430 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1a440 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
1a450 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
1a460 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
1a470 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1a480 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
1a490 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1a4a0 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
1a4b0 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
1a4c0 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
1a4d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1a4e0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74  to the.  ** left
1a4f0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1a500 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20   operator - the 
1a510 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  "A" select..  */
1a520 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
1a530 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1a540 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
1a550 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
1a560 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1a570 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c  P_InitCoroutine,
1a580 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61 64   regAddrA, 0, ad
1a590 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56 64  drSelectA);.  Vd
1a5a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c  beComment((v, "l
1a5b0 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
1a5c0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20   pPrior->iLimit 
1a5d0 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65  = regLimitA;.  e
1a5e0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
1a5f0 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
1a600 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
1a610 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1a620 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
1a630 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69 74  &destA);.  sqlit
1a640 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
1a650 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41 29 3b  ne(v, regAddrA);
1a660 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
1a670 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
1a680 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a690 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
1a6a0 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
1a6b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
1a6c0 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
1a6d0 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
1a6e0 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
1a6f0 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
1a700 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1a710 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20   + 1;.  addr1 = 
1a720 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a730 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
1a740 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c  utine, regAddrB,
1a750 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29   0, addrSelectB)
1a760 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
1a770 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43  (v, "right SELEC
1a780 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
1a790 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
1a7a0 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
1a7b0 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
1a7c0 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1a7d0 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
1a7e0 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61  t = 0;  .  expla
1a7f0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
1a800 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
1a810 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
1a820 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
1a830 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
1a840 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
1a850 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
1a860 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
1a870 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
1a880 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1a890 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  v, regAddrB);.. 
1a8a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1a8b0 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1a8c0 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1a8d0 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41 0a  nt row of the A.
1a8e0 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1a8f0 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1a900 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1a910 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1a920 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1a930 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f  t((v, "Output ro
1a940 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a  utine for A"));.
1a950 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65 6e    addrOutA = gen
1a960 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f  erateOutputSubro
1a970 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20  utine(pParse,.  
1a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a990 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74 2c  , &destA, pDest,
1a9a0 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20 20   regOutA,.      
1a9b0 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72             regPr
1a9c0 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62  ev, pKeyDup, lab
1a9d0 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20  elEnd);.  .  /* 
1a9e0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
1a9f0 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
1aa00 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ts the current r
1aa10 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a  ow of the B.  **
1aa20 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e   select as the n
1aa30 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f  ext output row o
1aa40 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  f the compound s
1aa50 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  elect..  */.  if
1aa60 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
1aa70 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
1aa80 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1aa90 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1aaa0 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29 29  routine for B"))
1aab0 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20 3d  ;.    addrOutB =
1aac0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1aad0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1aae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1aaf0 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70 44     p, &destB, pD
1ab00 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20  est, regOutB,.  
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1ab20 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1ab30 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a   labelEnd);.  }.
1ab40 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
1ab50 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b 0a  Unref(pKeyDup);.
1ab60 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1ab70 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
1ab80 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
1ab90 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
1aba0 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  A.  ** are exhau
1abb0 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
1abc0 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20 72  ta in select B r
1abd0 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
1abe0 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  f( op==TK_EXCEPT
1abf0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52   || op==TK_INTER
1ac00 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1ac10 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45  EofA_noB = addrE
1ac20 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a  ofA = labelEnd;.
1ac30 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1ac40 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1ac50 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f 75  v, "eof-A subrou
1ac60 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1ac70 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56  rEofA = sqlite3V
1ac80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ac90 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1aca0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 61  addrOutB);.    a
1acb0 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71  ddrEofA_noB = sq
1acc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1acd0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1ace0 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrB, labelEnd)
1acf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad10 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1ad20 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1ad30 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
1ad40 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d  ddrEofA);.    p-
1ad50 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
1ad60 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
1ad70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
1ad80 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
1ad90 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
1ada0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1adb0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
1adc0 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1add0 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
1ade0 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1adf0 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1ae00 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
1ae10 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1ae20 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
1ae30 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
1ae40 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70  rEofA;.    if( p
1ae50 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70  ->nSelectRow > p
1ae60 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1ae70 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
1ae80 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
1ae90 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  ectRow;.  }else{
1aea0 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1aeb0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1aec0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
1aed0 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
1aee0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aef0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1af00 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1af10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1af20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1af30 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1af40 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65 43  labelEnd); VdbeC
1af50 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1af60 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1af70 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20  v, addrEofB);.  
1af80 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1af90 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1afa0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a  the case of A<B.
1afb0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1afc0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74  omment((v, "A-lt
1afd0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1afe0 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73  ;.  addrAltB = s
1aff0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b000 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1b010 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29  gOutA, addrOutA)
1b020 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1b030 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b040 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
1b050 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
1b060 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1b070 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1b080 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1b090 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1b0a0 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1b0b0 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20   of A==B.  */.  
1b0c0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1b0d0 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1b0e0 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c   addrAltB;.  }el
1b0f0 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  se if( op==TK_IN
1b100 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1b110 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1b120 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42  tB;.    addrAltB
1b130 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1b140 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b150 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62  ((v, "A-eq-B sub
1b160 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20  routine"));.    
1b170 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73  addrAeqB =.    s
1b180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b190 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1b1a0 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1b1b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b1c0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1b1d0 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b1e0 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
1b1f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b200 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1b210 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
1b220 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1b230 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
1b240 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1b250 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
1b260 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1b270 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
1b280 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1b290 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
1b2a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b2b0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
1b2c0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
1b2d0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1b2e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1b2f0 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64  d, regAddrB, add
1b300 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65  rEofB); VdbeCove
1b310 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
1b320 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61  e3VdbeGoto(v, la
1b330 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20  belCmpr);..  /* 
1b340 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f  This code runs o
1b350 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  nce to initializ
1b360 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20  e everything..  
1b370 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1b380 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1b390 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
1b3a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b3b0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1b3c0 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64  ddrEofA_noB); Vd
1b3d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b3e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b3f0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b400 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1b410 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1b420 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  e(v);..  /* Impl
1b430 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
1b440 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
1b450 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1b460 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
1b470 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
1b480 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b490 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
1b4a0 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
1b4b0 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
1b4c0 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
1b4d0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1b4e0 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
1b4f0 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64  iSdst, destB.iSd
1b500 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  st, nOrderBy,.  
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
1b530 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
1b540 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
1b550 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
1b560 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
1b570 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b580 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
1b590 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
1b5a0 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56  qB, addrAgtB); V
1b5b0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b5c0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
1b5d0 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  e this point in 
1b5e0 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61  order to termina
1b5f0 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20  te the query..  
1b600 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1b610 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1b620 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a  labelEnd);..  /*
1b630 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
1b640 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  of output column
1b650 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  s.  */.  if( pDe
1b660 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  st->eDest==SRT_O
1b670 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c  utput ){.    Sel
1b680 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50  ect *pFirst = pP
1b690 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28  rior;.    while(
1b6a0 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
1b6b0 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
1b6c0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67  t->pPrior;.    g
1b6d0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
1b6e0 65 73 28 70 50 61 72 73 65 2c 20 70 46 69 72 73  es(pParse, pFirs
1b6f0 74 2d 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d  t->pSrc, pFirst-
1b700 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20  >pEList);.  }.. 
1b710 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74   /* Reassembly t
1b720 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1b730 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  y so that it wil
1b740 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65  l be freed corre
1b750 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  ctly.  ** by the
1b760 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1b770 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50  n */.  if( p->pP
1b780 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rior ){.    sqli
1b790 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1b7a0 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
1b7b0 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20    }.  p->pPrior 
1b7c0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69  = pPrior;.  pPri
1b7d0 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a  or->pNext = p;..
1b7e0 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73    /*** TBD:  Ins
1b7f0 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63  ert subroutine c
1b800 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75  alls to close cu
1b810 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c  rsors on incompl
1b820 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75  ete.  **** subqu
1b830 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78  eries ****/.  ex
1b840 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
1b850 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
1b860 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a  ub1, iSub2, 0);.
1b870 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
1b880 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64  >nErr!=0;.}.#end
1b890 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
1b8a0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1b8b0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1b8c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1b8d0 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74  IEW)../* An inst
1b8e0 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62 73  ance of the Subs
1b8f0 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20  tContext object 
1b900 64 65 73 63 72 69 62 65 73 20 61 6e 20 73 75 62  describes an sub
1b910 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a  stitution edit.*
1b920 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  * to be performe
1b930 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65  d on a parse tre
1b940 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66  e..**.** All ref
1b950 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d  erences to colum
1b960 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62  ns in table iTab
1b970 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72 65 70  le are to be rep
1b980 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65 73 70  laced by corresp
1b990 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73  onding.** expres
1b9a0 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e  sions in pEList.
1b9b0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1b9c0 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  ct SubstContext 
1b9d0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1b9e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
1b9f0 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1ba00 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54  text */.  int iT
1ba10 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1ba20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72      /* Replace r
1ba30 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
1ba40 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  s table */.  int
1ba50 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20   iNewTable;     
1ba60 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61         /* New ta
1ba70 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ble number */.  
1ba80 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20  int isLeftJoin; 
1ba90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1baa0 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20   TK_IF_NULL_ROW 
1bab0 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20  opcodes on each 
1bac0 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20  replacement */. 
1bad0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1bae0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  t;         /* Re
1baf0 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73  placement expres
1bb00 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74  sions */.} Subst
1bb10 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72  Context;../* For
1bb20 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
1bb30 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
1bb40 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 53   substExprList(S
1bb50 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78  ubstContext*, Ex
1bb60 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63  prList*);.static
1bb70 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63   void substSelec
1bb80 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c  t(SubstContext*,
1bb90 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a   Select*, int);.
1bba0 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
1bbb0 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
1bbc0 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
1bbd0 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
1bbe0 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
1bbf0 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
1bc00 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
1bc10 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
1bc20 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
1bc30 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
1bc40 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
1bc50 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
1bc60 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
1bc70 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
1bc80 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
1bc90 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
1bca0 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
1bcb0 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
1bcc0 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
1bcd0 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
1bce0 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
1bcf0 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
1bd00 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1bd10 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
1bd20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
1bd30 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
1bd40 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
1bd50 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
1bd60 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1bd70 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
1bd80 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
1bd90 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
1bda0 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
1bdb0 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
1bdc0 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
1bdd0 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
1bde0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
1bdf0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
1be00 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
1be10 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 53 75  *substExpr(.  Su
1be20 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1be30 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74  st,  /* Descript
1be40 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1be50 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  itution */.  Exp
1be60 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
1be70 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77      /* Expr in w
1be80 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69 6f  hich substitutio
1be90 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20  n occurs */.){. 
1bea0 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
1beb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1bec0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1bed0 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
1bee0 69 6e 29 20 26 26 20 70 45 78 70 72 2d 3e 69 52  in) && pExpr->iR
1bef0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70  ightJoinTable==p
1bf00 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1bf10 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67  .    pExpr->iRig
1bf20 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53  htJoinTable = pS
1bf30 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1bf40 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72  .  }.  if( pExpr
1bf50 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
1bf60 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  && pExpr->iTable
1bf70 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65  ==pSubst->iTable
1bf80 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
1bf90 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
1bfa0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
1bfb0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
1bfc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
1bfd0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78   *pNew;.      Ex
1bfe0 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62  pr *pCopy = pSub
1bff0 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45  st->pEList->a[pE
1c000 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
1c010 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  xpr;.      Expr 
1c020 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20  ifNullRow;.     
1c030 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74 2d   assert( pSubst-
1c040 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45  >pEList!=0 && pE
1c050 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75  xpr->iColumn<pSu
1c060 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  bst->pEList->nEx
1c070 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  pr );.      asse
1c080 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  rt( pExpr->pLeft
1c090 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
1c0a0 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ight==0 );.     
1c0b0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
1c0c0 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20  IsVector(pCopy) 
1c0d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1c0e0 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67  e3VectorErrorMsg
1c0f0 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c  (pSubst->pParse,
1c100 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d   pCopy);.      }
1c110 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1c120 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62  lite3 *db = pSub
1c130 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a  st->pParse->db;.
1c140 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
1c150 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26  st->isLeftJoin &
1c160 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f  & pCopy->op!=TK_
1c170 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1c180 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75      memset(&ifNu
1c190 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66  llRow, 0, sizeof
1c1a0 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20  (ifNullRow));.  
1c1b0 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1c1c0 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c  w.op = TK_IF_NUL
1c1d0 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20  L_ROW;.         
1c1e0 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74   ifNullRow.pLeft
1c1f0 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20   = pCopy;.      
1c200 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54      ifNullRow.iT
1c210 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1c220 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  NewTable;.      
1c230 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e      pCopy = &ifN
1c240 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20  ullRow;.        
1c250 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  }.        pNew =
1c260 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1c270 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20  db, pCopy, 0);. 
1c280 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1c290 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
1c2a0 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20   & EP_FromJoin) 
1c2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1c2c0 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  w->iRightJoinTab
1c2d0 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67  le = pExpr->iRig
1c2e0 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20  htJoinTable;.   
1c2f0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
1c300 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69  gs |= EP_FromJoi
1c310 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
1c320 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1c330 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1c340 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1c350 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
1c360 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1c370 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1c380 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
1c390 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  W && pExpr->iTab
1c3a0 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1c3b0 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  le ){.      pExp
1c3c0 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  r->iTable = pSub
1c3d0 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1c3e0 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e     }.    pExpr->
1c3f0 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1c400 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1c410 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78  >pLeft);.    pEx
1c420 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1c430 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1c440 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1c450 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1c460 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1c470 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1c480 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1c490 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1c4a0 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  x.pSelect, 1);. 
1c4b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c4c0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1c4d0 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1c4e0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1c4f0 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1c500 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1c510 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1c520 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1c530 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70  ubst, /* Descrip
1c540 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1c550 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  titution */.  Ex
1c560 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
1c570 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1c580 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1c590 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1c5a0 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  utes */.){.  int
1c5b0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1c5c0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1c5d0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1c5e0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1c5f0 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1c600 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1c610 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61  pSubst, pList->a
1c620 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
1c630 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1c640 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62  bstSelect(.  Sub
1c650 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1c660 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1c670 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1c680 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ution */.  Selec
1c690 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1c6a0 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1c6b0 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1c6c0 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1c6d0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ons */.  int doP
1c6e0 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rior           /
1c6f0 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1c700 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1c710 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1c720 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1c730 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1c740 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1c750 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1c760 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1c770 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1c780 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  t, p->pEList);. 
1c790 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1c7a0 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f  (pSubst, p->pGro
1c7b0 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74  upBy);.    subst
1c7c0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1c7d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
1c7e0 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1c7f0 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1c800 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  , p->pHaving);. 
1c810 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1c820 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1c830 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
1c840 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1c850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
1c860 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c!=0 );.    for(
1c870 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1c880 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1c890 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1c8a0 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1c8b0 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  ct(pSubst, pItem
1c8c0 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  ->pSelect, 1);. 
1c8d0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1c8e0 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1c8f0 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1c900 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49  rList(pSubst, pI
1c910 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1c920 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1c930 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1c940 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1c950 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1c960 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1c970 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1c980 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1c990 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1c9a0 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1c9b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1c9c0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1c9d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1c9e0 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1c9f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1ca00 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1ca10 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1ca20 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1ca30 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1ca40 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1ca50 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1ca60 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1ca70 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1ca80 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1ca90 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1caa0 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1cab0 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1cac0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1cad0 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1cae0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1caf0 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1cb00 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1cb10 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1cb20 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1cb30 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1cb40 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1cb50 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1cb60 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1cb70 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1cb80 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1cb90 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1cba0 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1cbb0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1cbc0 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1cbd0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1cbe0 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1cbf0 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1cc00 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1cc10 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1cc20 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1cc30 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1cc40 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1cc50 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1cc60 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1cc70 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1cc80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1cc90 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1cca0 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1ccb0 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1ccc0 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1ccd0 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1cce0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1ccf0 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1cd00 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1cd10 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1cd20 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1cd30 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1cd40 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1cd50 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1cd60 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1cd70 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1cd80 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1cd90 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1cda0 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1cdb0 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1cdc0 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1cdd0 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1cde0 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1cdf0 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1ce00 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
1ce10 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
1ce20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
1ce30 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
1ce40 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1ce50 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1ce60 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1ce70 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
1ce80 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
1ce90 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1cea0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1ceb0 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71  (2a) the outer q
1cec0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f  uery is not a jo
1ced0 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  in.**        and
1cee0 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72 20   (2b) the outer 
1cef0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1cf00 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f 74  se subqueries ot
1cf10 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1cf20 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d 2d  .**        FROM-
1cf30 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 20  clause subquery 
1cf40 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69 64  that is a candid
1cf50 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e 69  ate for flatteni
1cf60 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20 20  ng.  (2b is.**  
1cf70 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69 63        due to tic
1cf80 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1cf90 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30 31  9abf80] from 201
1cfa0 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20  5-02-09.).**.** 
1cfb0 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
1cfc0 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
1cfd0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1cfe0 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 2a 2a 20 20  a LEFT JOIN.**  
1cff0 20 20 20 20 20 20 6f 72 20 74 68 65 20 73 75 62        or the sub
1d000 71 75 65 72 79 20 69 73 20 6e 6f 74 20 69 74 73  query is not its
1d010 65 6c 66 20 61 20 6a 6f 69 6e 20 61 6e 64 20 74  elf a join and t
1d020 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1d030 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  s not.**        
1d040 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a  an aggregate..**
1d050 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20 73  .**   (4)  The s
1d060 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44  ubquery is not D
1d070 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
1d080 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69  (**)  At one poi
1d090 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  nt restrictions 
1d0a0 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69  (4) and (5) defi
1d0b0 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20  ned a subset of 
1d0c0 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20  DISTINCT.**     
1d0d0 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74     sub-queries t
1d0e0 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65  hat were exclude
1d0f0 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69  d from this opti
1d100 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69  mization. Restri
1d110 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20  ction .**       
1d120 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62   (4) has since b
1d130 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20  een expanded to 
1d140 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54  exclude all DIST
1d150 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e  INCT subqueries.
1d160 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54 68  .**.**   (6)  Th
1d170 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1d180 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
1d190 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
1d1a0 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20  query is not.** 
1d1b0 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e         DISTINCT.
1d1c0 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1d1d0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 61  e subquery has a
1d1e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
1d1f0 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75 65  ODO:  For subque
1d200 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20  ries without.** 
1d210 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c         A FROM cl
1d220 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20 61  ause, consider a
1d230 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61  dding a FROM cla
1d240 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70 65  use with the spe
1d250 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  cial.**        t
1d260 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65  able sqlite_once
1d270 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
1d280 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 63  f a single row c
1d290 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20  ontaining a.**  
1d2a0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c        single NUL
1d2b0 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20  L..**.**   (8)  
1d2c0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d2d0 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1d2e0 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1d2f0 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e  ry is not a join
1d300 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 54  ..**.**   (9)  T
1d310 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1d320 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1d330 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1d340 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a  y does not use.*
1d350 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67 61  *        aggrega
1d360 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  tes..**.**  (**)
1d370 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31    Restriction (1
1d380 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66  0) was removed f
1d390 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20  rom the code on 
1d3a0 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77  2005-02-05 but w
1d3b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69  e.**        acci
1d3c0 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74  dently carried t
1d3d0 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61  he comment forwa
1d3e0 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39  rd until 2014-09
1d3f0 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a  -15.  Original.*
1d400 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20 22  *        text: "
1d410 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d420 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
1d430 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
1d440 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20  r query .**     
1d450 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20     does not use 
1d460 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28  LIMIT.".**.**  (
1d470 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  11)  The subquer
1d480 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  y and the outer 
1d490 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74  query do not bot
1d4a0 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59 20  h have ORDER BY 
1d4b0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  clauses..**.**  
1d4c0 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d  (**)  Not implem
1d4d0 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64  ented.  Subsumed
1d4e0 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f   into restrictio
1d4f0 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65 76  n (3).  Was prev
1d500 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iously.**       
1d510 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73 74   a separate rest
1d520 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67  riction deriving
1d530 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35   from ticket #35
1d540 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20  0..**.**  (13)  
1d550 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1d560 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
1d570 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d  not both use LIM
1d580 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20  IT..**.**  (14) 
1d590 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1d5a0 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45  es not use OFFSE
1d5b0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20  T..**.**  (15)  
1d5c0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1d5d0 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
1d5e0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1d5f0 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   or the.**      
1d600 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20    subquery does 
1d610 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49 54  not have a LIMIT
1d620 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20   clause..**     
1d630 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 23     (See ticket #
1d640 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20  2339 and ticket 
1d650 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a  [02a8e81d44])..*
1d660 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65 20  *.**  (16)  The 
1d670 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1d680 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ot an aggregate 
1d690 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20  or the subquery 
1d6a0 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 6e  does.**        n
1d6b0 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52  ot contain ORDER
1d6c0 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32   BY.  (Ticket #2
1d6d0 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20  942)  This used 
1d6e0 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a  to not matter.**
1d6f0 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65          until we
1d700 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20   introduced the 
1d710 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66  group_concat() f
1d720 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a  unction.  .**.**
1d730 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62 2d    (17)  The sub-
1d740 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
1d750 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1d760 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f 4e  or it is a UNION
1d770 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20 20   ALL .**        
1d780 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65 20  compound clause 
1d790 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c 79  made up entirely
1d7a0 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74   of non-aggregat
1d7b0 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20 0a  e queries, and .
1d7c0 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70 61  **        the pa
1d7d0 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  rent query:.**.*
1d7e0 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1d7f0 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74 20  not itself part 
1d800 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
1d810 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20 20  lect,.**        
1d820 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61 67    * is not an ag
1d830 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54 49  gregate or DISTI
1d840 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a 2a  NCT query, and.*
1d850 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73 20  *          * is 
1d860 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a  not a join.**.**
1d870 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
1d880 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
1d890 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
1d8a0 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
1d8b0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
1d8c0 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
1d8d0 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
1d8e0 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
1d8f0 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
1d900 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
1d910 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1d920 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1d930 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
1d940 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
1d950 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
1d960 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
1d970 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
1d980 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
1d990 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
1d9a0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
1d9b0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
1d9c0 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
1d9d0 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
1d9e0 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
1d9f0 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
1da00 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
1da10 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
1da20 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
1da30 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
1da40 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
1da50 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
1da60 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
1da70 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
1da80 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1da90 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
1daa0 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
1dab0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
1dac0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
1dad0 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
1dae0 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
1daf0 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
1db00 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
1db10 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
1db20 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
1db30 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
1db40 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
1db50 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
1db60 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
1db70 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1db80 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
1db90 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
1dba0 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
1dbb0 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  by clause of the
1dbc0 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
1dbd0 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
1dbe0 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
1dbf0 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
1dc00 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
1dc10 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71 75   (19)  The subqu
1dc20 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1dc30 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
1dc40 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
1dc50 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76  ot.**        hav
1dc60 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
1dc70 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49  ..**.**  (20)  I
1dc80 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1dc90 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1dca0 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75  lect, then it mu
1dcb0 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  st not use.**   
1dcc0 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59       an ORDER BY
1dcd0 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74   clause.  Ticket
1dce0 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c   #3773.  We coul
1dcf0 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e  d relax this con
1dd00 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20  straint.**      
1dd10 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61    somewhat by sa
1dd20 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74 65  ying that the te
1dd30 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
1dd40 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a   BY clause must.
1dd50 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61 72  **        appear
1dd60 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72   as unmodified r
1dd70 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  esult columns in
1dd80 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1dd90 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20  .  But we.**    
1dda0 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f      have other o
1ddb0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20  ptimizations in 
1ddc0 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74  mind to deal wit
1ddd0 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a  h that case..**.
1dde0 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73 75  **  (21)  The su
1ddf0 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1de00 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1de10 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1de20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1de30 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69  STINCT.  (See ti
1de40 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63  cket [752e1646fc
1de50 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20  ])..**.**  (22) 
1de60 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1de70 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1de80 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33   CTE..**.**  (23
1de90 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69 73  )  The parent is
1dea0 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65   not a recursive
1deb0 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75 62   CTE, or the sub
1dec0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 0a  -query is not a.
1ded0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1dee0 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20 72  nd query. This r
1def0 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65  estriction is be
1df00 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69  cause transformi
1df10 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ng the.**       
1df20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d   parent to a com
1df30 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66  pound query conf
1df40 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68  uses the code th
1df50 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20  at handles.**   
1df60 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71       recursive q
1df70 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53  ueries in multiS
1df80 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elect()..**.**  
1df90 28 32 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (24)  The subque
1dfa0 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
1dfb0 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73  regate that uses
1dfc0 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69   the built-in mi
1dfd0 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20  n() or .**      
1dfe0 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74    or max() funct
1dff0 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20  ions.  (Without 
1e000 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
1e010 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a  , a query like:.
1e020 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  **        "SELEC
1e030 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
1e040 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20   max(y), x FROM 
1e050 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e  t1)" would not n
1e060 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20  ecessarily.**   
1e070 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20       return the 
1e080 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63  value X for whic
1e090 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e  h Y was maximal.
1e0a0 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ).**.**.** In th
1e0b0 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20  is routine, the 
1e0c0 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
1e0d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1e0e0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a  e outer query..*
1e0f0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
1e100 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72  s p->pSrc->a[iFr
1e110 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74  om].  isAgg is t
1e120 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72  rue if the outer
1e130 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61   query.** uses a
1e140 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73 75  ggregates and su
1e150 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20 74  bqueryIsAgg is t
1e160 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
1e170 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
1e180 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c  tes..**.** If fl
1e190 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20  attening is not 
1e1a0 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20  attempted, this 
1e1b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1e1c0 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30  op and returns 0
1e1d0 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69  ..** If flatteni
1e1e0 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20  ng is attempted 
1e1f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1e200 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c  urns 1..**.** Al
1e210 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  l of the express
1e220 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73  ion analysis mus
1e230 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20  t occur on both 
1e240 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1e250 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75  and.** the subqu
1e260 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20  ery before this 
1e270 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f  routine runs..*/
1e280 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74  .static int flat
1e290 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50  tenSubquery(.  P
1e2a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1e2b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1e2c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1e2d0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1e2e0 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
1e2f0 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73  r outer SELECT s
1e300 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
1e310 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
1e320 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70     /* Index in p
1e330 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74  ->pSrc->a[] of t
1e340 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72  he inner subquer
1e350 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  y */.  int isAgg
1e360 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
1e370 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c  rue if outer SEL
1e380 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61  ECT uses aggrega
1e390 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
1e3a0 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49 73    int subqueryIs
1e3b0 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69  Agg    /* True i
1e3c0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75  f the subquery u
1e3d0 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ses aggregate fu
1e3e0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  nctions */.){.  
1e3f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
1e400 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  edAuthContext = 
1e410 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
1e420 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a  text;.  Select *
1e430 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43  pParent;    /* C
1e440 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c  urrent UNION ALL
1e450 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74 68   term of the oth
1e460 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 65  er query */.  Se
1e470 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
1e480 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
1e490 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
1e4a0 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  y" */.  Select *
1e4b0 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50  pSub1;      /* P
1e4c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69  ointer to the ri
1e4d0 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69  ghtmost select i
1e4e0 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  n sub-query */. 
1e4f0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
1e500 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
1e510 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1e520 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1e530 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
1e540 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
1e550 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1e560 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
1e570 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
1e580 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
1e590 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
1e5a0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
1e5b0 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
1e5c0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1e5d0 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
1e5e0 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
1e5f0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1e600 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f  NewParent = -1;/
1e610 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61  * Replacement ta
1e620 62 6c 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ble for iParent 
1e630 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a  */.  int isLeftJ
1e640 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  oin = 0; /* True
1e650 20 69 66 20 70 53 75 62 20 69 73 20 74 68 65 20   if pSub is the 
1e660 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 61 20  right side of a 
1e670 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20  LEFT JOIN */    
1e680 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1e690 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1e6a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
1e6b0 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1e6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e6d0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1e6e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1e6f0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
1e700 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
1e710 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
1e720 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e730 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
1e740 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
1e750 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1e760 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
1e770 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  f not..  */.  as
1e780 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
1e790 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
1e7a0 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62  r==0 );  /* Unab
1e7b0 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f  le to flatten co
1e7c0 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a  mpound queries *
1e7d0 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
1e7e0 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
1e7f0 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
1e800 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e  ttener) ) return
1e810 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e   0;.  pSrc = p->
1e820 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1e830 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30  pSrc && iFrom>=0
1e840 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e   && iFrom<pSrc->
1e850 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74  nSrc );.  pSubit
1e860 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46  em = &pSrc->a[iF
1e870 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20  rom];.  iParent 
1e880 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72  = pSubitem->iCur
1e890 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53  sor;.  pSub = pS
1e8a0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b  ubitem->pSelect;
1e8b0 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 21  .  assert( pSub!
1e8c0 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71  =0 );.  if( subq
1e8d0 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1e8e0 20 69 66 28 20 69 73 41 67 67 20 29 20 72 65 74   if( isAgg ) ret
1e8f0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e920 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20  tion (1)   */.  
1e930 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
1e940 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  >1 ) return 0;  
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e960 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1e970 63 74 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20  ction (2a)  */. 
1e980 20 20 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72     if( (p->pWher
1e990 65 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  e && ExprHasProp
1e9a0 65 72 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45  erty(p->pWhere,E
1e9b0 50 5f 53 75 62 71 75 65 72 79 29 29 0a 20 20 20  P_Subquery)).   
1e9c0 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70    || (sqlite3Exp
1e9d0 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45  rListFlags(p->pE
1e9e0 4c 69 73 74 29 20 26 20 45 50 5f 53 75 62 71 75  List) & EP_Subqu
1e9f0 65 72 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ery)!=0.     || 
1ea00 28 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  (sqlite3ExprList
1ea10 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42  Flags(p->pOrderB
1ea20 79 29 20 26 20 45 50 5f 53 75 62 71 75 65 72 79  y) & EP_Subquery
1ea30 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=0.    ){.    
1ea40 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ea80 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20  ion (2b)  */.   
1ea90 20 7d 0a 20 20 7d 0a 0a 20 20 70 53 75 62 53 72   }.  }..  pSubSr
1eaa0 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a  c = pSub->pSrc;.
1eab0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72    assert( pSubSr
1eac0 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20  c );.  /* Prior 
1ead0 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32  to version 3.1.2
1eae0 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  , when LIMIT and
1eaf0 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62   OFFSET had to b
1eb00 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e  e simple constan
1eb10 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62  ts,.  ** not arb
1eb20 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69 6f  itrary expressio
1eb30 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
1eb40 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
1eb50 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1eb60 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
1eb70 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
1eb80 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
1eb90 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
1eba0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1ebb0 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
1ebc0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1ebd0 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
1ebe0 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
1ebf0 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
1ec00 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
1ec10 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1ec20 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
1ec30 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ec40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ec50 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
1ec60 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
1ec70 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1eca0 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
1ecb0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1ecc0 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
1ecd0 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
1ece0 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
1ecf0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ed30 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
1ed40 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
1ed50 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed70 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1ed80 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
1ed90 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1eda0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
1edb0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1edc0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1edd0 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28  on (5)  */.  if(
1ede0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1edf0 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
1ee00 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
1ee10 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ee20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ee30 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
1ee40 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1ee50 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1ee60 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72  t)!=0 && subquer
1ee70 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72  yIsAgg ){.     r
1ee80 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ee90 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1eea0 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (6)  */.  }.  if
1eeb0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
1eec0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1eed0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1eee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ef10 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
1ef20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
1ef30 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
1ef40 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ef70 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
1ef80 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1ef90 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
1efa0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1efb0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1efc0 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
1efd0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
1efe0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1eff0 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
1f000 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1f010 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f020 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
1f030 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75  .  testcase( pSu
1f040 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1f050 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20  _Recursive );.  
1f060 74 65 73 74 63 61 73 65 28 20 70 53 75 62 2d 3e  testcase( pSub->
1f070 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 69  selFlags & SF_Mi
1f080 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69 66 28  nMaxAgg );.  if(
1f090 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1f0a0 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 7c  & (SF_Recursive|
1f0b0 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20 29 7b  SF_MinMaxAgg) ){
1f0c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
1f0d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
1f0e0 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a 2f 0a  22) and (24) */.
1f0f0 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
1f100 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1f110 72 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e  rsive) && pSub->
1f120 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 65  pPrior ){.    re
1f130 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
1f140 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f 0a 20  iction (23) */. 
1f150 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
1f160 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1f170 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1f180 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  nd of a LEFT JOI
1f190 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  N, then the.  **
1f1a0 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
1f1b0 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73 65  t be a join itse
1f1c0 6c 66 2e 20 20 45 78 61 6d 70 6c 65 20 6f 66 20  lf.  Example of 
1f1d0 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
1f1e0 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1f1f0 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1f200 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
1f210 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
1f220 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
1f230 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
1f240 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
1f250 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
1f260 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1f270 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
1f280 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
1f290 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
1f2a0 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
1f2b0 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71    ** If the subq
1f2c0 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
1f2d0 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
1f2e0 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74  EFT JOIN, then t
1f2f0 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75  he outer.  ** qu
1f300 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  ery cannot be an
1f310 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
1f320 73 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74  s is an artifact
1f330 20 6f 66 20 74 68 65 20 77 61 79 20 61 67 67 72   of the way aggr
1f340 65 67 61 74 65 73 0a 20 20 2a 2a 20 61 72 65 20  egates.  ** are 
1f350 70 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72  processed - ther
1f360 65 20 69 73 20 6e 6f 74 20 6d 65 63 68 61 6e 69  e is not mechani
1f370 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  sm to determine 
1f380 69 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e  if the LEFT JOIN
1f390 0a 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75  .  ** table shou
1f3a0 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a  ld be all-NULL..
1f3b0 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
1f3c0 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c  so tickets #306,
1f3d0 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30   #350, and #3300
1f3e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
1f3f0 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  ubitem->fg.joint
1f400 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
1f410 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74  =0 ){.    isLeft
1f420 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66  Join = 1;.    if
1f430 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e  ( pSubSrc->nSrc>
1f440 31 20 7c 7c 20 69 73 41 67 67 20 29 7b 0a 20 20  1 || isAgg ){.  
1f450 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f460 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   Restriction (3)
1f470 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69   */.    }.  }.#i
1f480 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
1f490 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c  A_IFNULLROW.  el
1f4a0 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  se if( iFrom>0 &
1f4b0 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  & !isAgg ){.    
1f4c0 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66  /* Setting isLef
1f4d0 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73  tJoin to -1 caus
1f4e0 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  es OP_IfNullRow 
1f4f0 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65  opcodes to be ge
1f500 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20  nerated for.    
1f510 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ** every referen
1f520 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74  ce to any result
1f530 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62   column from sub
1f540 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c  query in a join,
1f550 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 20 20 20   even though.   
1f560 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74   ** they are not
1f570 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 69   necessary.  Thi
1f580 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65  s will stress-te
1f590 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c  st the OP_IfNull
1f5a0 52 6f 77 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  Row opcode. */. 
1f5b0 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20     isLeftJoin = 
1f5c0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
1f5d0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f5e0 20 31 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d   17: If the sub-
1f5f0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1f600 75 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e  und SELECT, then
1f610 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73   it must.  ** us
1f620 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e  e only the UNION
1f630 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41   ALL operator. A
1f640 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  nd none of the s
1f650 69 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65  imple select que
1f660 72 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d  ries.  ** that m
1f670 61 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f  ake up the compo
1f680 75 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61  und SELECT are a
1f690 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67  llowed to be agg
1f6a0 72 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e  regate or distin
1f6b0 63 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e  ct.  ** queries.
1f6c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  .  */.  if( pSub
1f6d0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1f6e0 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  if( pSub->pOrder
1f6f0 42 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  By ){.      retu
1f700 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69  rn 0;  /* Restri
1f710 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20  ction 20 */.    
1f720 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  }.    if( isAgg 
1f730 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  || (p->selFlags 
1f740 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1f750 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21  0 || pSrc->nSrc!
1f760 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =1 ){.      retu
1f770 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1f780 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20  for(pSub1=pSub; 
1f790 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75  pSub1; pSub1=pSu
1f7a0 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  b1->pPrior){.   
1f7b0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
1f7c0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1f7d0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1f7e0 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
1f7f0 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20  Distinct );.    
1f800 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75    testcase( (pSu
1f810 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
1f820 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
1f830 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41  ggregate))==SF_A
1f840 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20  ggregate );.    
1f850 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
1f860 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSrc!=0 );.     
1f870 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70   assert( pSub->p
1f880 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53  EList->nExpr==pS
1f890 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ub1->pEList->nEx
1f8a0 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pr );.      if( 
1f8b0 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1f8c0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1f8d0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d  SF_Aggregate))!=
1f8e0 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  0.       || (pSu
1f8f0 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
1f900 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
1f910 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62   .       || pSub
1f920 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a  1->pSrc->nSrc<1.
1f930 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1f940 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1f950 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
1f960 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e  e( pSub1->pSrc->
1f970 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a  nSrc>1 );.    }.
1f980 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74  .    /* Restrict
1f990 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69  ion 18. */.    i
1f9a0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
1f9b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
1f9c0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
1f9d0 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  ii<p->pOrderBy->
1f9e0 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
1f9f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72        if( p->pOr
1fa00 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78  derBy->a[ii].u.x
1fa10 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20  .iOrderByCol==0 
1fa20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1fa30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1fa40 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65   /***** If we re
1fa50 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
1fa60 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
1fa70 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a  rmitted. *****/.
1fa80 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
1fa90 70 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74  pParse,p,("flatt
1faa0 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65  en %s.%p from te
1fab0 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  rm %d\n",.      
1fac0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75               pSu
1fad0 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75  b->zSelName, pSu
1fae0 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f  b, iFrom));..  /
1faf0 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
1fb00 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
1fb10 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1fb20 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
1fb30 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
1fb40 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
1fb50 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1fb60 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1fb70 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
1fb80 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
1fb90 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
1fba0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
1fbb0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1fbc0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1fbd0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1fbe0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1fbf0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
1fc00 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
1fc10 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
1fc20 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
1fc30 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
1fc40 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1fc50 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
1fc60 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
1fc70 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1fc80 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
1fc90 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
1fca0 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
1fcb0 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
1fcc0 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
1fcd0 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
1fce0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1fcf0 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
1fd00 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
1fd10 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
1fd20 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
1fd30 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1fd40 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
1fd50 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
1fd60 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
1fd70 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
1fd80 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1fd90 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
1fda0 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
1fdb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
1fdc0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1fdd0 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
1fde0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
1fdf0 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
1fe00 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
1fe10 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
1fe20 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1fe30 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
1fe40 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1fe50 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
1fe60 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1fe70 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1fe80 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
1fe90 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1fea0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1feb0 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
1fec0 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
1fed0 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
1fee0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1fef0 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
1ff00 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
1ff10 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
1ff20 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1ff30 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
1ff40 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1ff50 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
1ff60 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
1ff70 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1ff80 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1ff90 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
1ffa0 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
1ffb0 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
1ffc0 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
1ffd0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
1ffe0 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
1fff0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
20000 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
20010 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
20020 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
20030 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
20040 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
20050 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
20060 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
20070 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
20080 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
20090 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
200a0 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
200b0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
200c0 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
200d0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
200e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
200f0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
20100 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
20110 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
20120 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  mit = 0;.    p->
20130 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
20140 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
20150 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
20160 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  0);.    sqlite3S
20170 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65  electSetName(pNe
20180 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d  w, pSub->zSelNam
20190 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  e);.    p->pOffs
201a0 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
201b0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
201c0 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
201d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
201e0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
201f0 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
20200 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  = TK_ALL;.    if
20210 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
20220 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
20230 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65  Prior;.    }else
20240 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50  {.      pNew->pP
20250 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
20260 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
20270 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ) pPrior->pNext 
20280 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e  = pNew;.      pN
20290 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ew->pNext = p;. 
202a0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
202b0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c   pNew;.      SEL
202c0 45 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73  ECTTRACE(2,pPars
202d0 65 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22  e,p,.         ("
202e0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
202f0 79 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61  y flattener crea
20300 74 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65  tes %s.%p as pee
20310 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  r\n",.         p
20320 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70  New->zSelName, p
20330 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  New));.    }.   
20340 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
20350 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
20360 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69  ;.  }..  /* Begi
20370 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  n flattening the
20380 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20   iFrom-th entry 
20390 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
203a0 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  se .  ** in the 
203b0 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a  outer query..  *
203c0 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31  /.  pSub = pSub1
203d0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65   = pSubitem->pSe
203e0 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  lect;..  /* Dele
203f0 74 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  te the transient
20400 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
20410 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20420 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
20430 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ry.  */.  sqlite
20440 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
20450 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  item->zDatabase)
20460 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
20470 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
20480 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
20490 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
204a0 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  item->zAlias);. 
204b0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
204c0 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62  base = 0;.  pSub
204d0 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  item->zName = 0;
204e0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  .  pSubitem->zAl
204f0 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ias = 0;.  pSubi
20500 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30  tem->pSelect = 0
20510 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65  ;..  /* Defer de
20520 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65  leting the Table
20530 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
20540 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
20550 20 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20   subquery until 
20560 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
20570 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65  is.  ** complete
20580 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61  , since there ma
20590 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78  y still exist Ex
205a0 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20  pr.pTab entries 
205b0 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20  that.  ** refer 
205c0 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
205d0 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74  even after flatt
205e0 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23  ening.  Ticket #
205f0 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  3346..  **.  ** 
20600 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69  pSubitem->pTab i
20610 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c  s always non-NUL
20620 4c 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69  L by test restri
20630 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73  ctions and tests
20640 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69   above..  */.  i
20650 66 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74  f( ALWAYS(pSubit
20660 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a  em->pTab!=0) ){.
20670 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54      Table *pTabT
20680 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d  oDel = pSubitem-
20690 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70  >pTab;.    if( p
206a0 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65  TabToDel->nTabRe
206b0 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61  f==1 ){.      Pa
206c0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
206d0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
206e0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
206f0 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e       pTabToDel->
20700 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54  pNextZombie = pT
20710 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
20720 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c  Tab;.      pTopl
20730 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
20740 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20   = pTabToDel;.  
20750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20760 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65  TabToDel->nTabRe
20770 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
20780 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
20790 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
207a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
207b0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
207c0 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
207d0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
207e0 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
207f0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
20800 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
20810 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
20820 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
20830 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
20840 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
20850 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
20860 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
20870 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
20880 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
20890 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
208a0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
208b0 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
208c0 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
208d0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
208e0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
208f0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
20900 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
20910 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
20920 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
20930 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
20940 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
20950 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
20960 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
20970 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
20980 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
20990 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
209a0 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
209b0 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
209c0 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
209d0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
209e0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
209f0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
20a00 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
20a10 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
20a20 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
20a30 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
20a40 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
20a50 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
20a60 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
20a70 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
20a80 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
20a90 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
20aa0 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
20ab0 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
20ac0 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
20ad0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
20ae0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
20af0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
20b00 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
20b10 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
20b20 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
20b30 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
20b40 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
20b50 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
20b60 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
20b70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
20b80 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
20b90 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
20ba0 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
20bb0 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
20bc0 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
20bd0 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
20be0 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
20bf0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
20c00 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
20c10 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  ->fg.jointype;. 
20c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20c30 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21  assert( pParent!
20c40 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e  =p );  /* 2nd an
20c50 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d  d subsequent tim
20c60 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  es through the l
20c70 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72  oop */.      pSr
20c80 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
20c90 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
20ca0 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20  stAppend(db, 0, 
20cb0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
20cc0 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pSrc==0 ){.    
20cd0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
20ce0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
20cf0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20d00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20d10 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72    /* The subquer
20d20 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20  y uses a single 
20d30 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  slot of the FROM
20d40 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
20d50 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72  uter.    ** quer
20d60 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75  y.  If the subqu
20d70 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61  ery has more tha
20d80 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e  n one element in
20d90 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
20da0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78  ,.    ** then ex
20db0 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71  pand the outer q
20dc0 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61  uery to make spa
20dd0 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c  ce for it to hol
20de0 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20  d all elements. 
20df0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62     ** of the sub
20e00 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
20e10 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
20e20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53    **.    **    S
20e30 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
20e40 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  A, (SELECT * FRO
20e50 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74  M sub1, sub2), t
20e60 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  abB;.    **.    
20e70 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  ** The outer que
20e80 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69  ry has 3 slots i
20e90 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
20ea0 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20  e.  One slot of 
20eb0 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
20ec0 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64   query (the midd
20ed0 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64  le slot) is used
20ee0 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79   by the subquery
20ef0 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  .  The next.    
20f00 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ** block of code
20f10 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65   will expand the
20f20 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f   outer query FRO
20f30 4d 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c  M clause to 4 sl
20f40 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ots..    ** The 
20f50 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65  middle slot is e
20f60 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
20f70 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
20f80 20 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20   make space.    
20f90 2a 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65  ** for the two e
20fa0 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
20fb0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
20fc0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
20fd0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
20fe0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
20ff0 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
21000 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
21010 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
21020 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
21030 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
21040 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
21050 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
21060 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
21070 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
21080 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
21090 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
210a0 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
210b0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
210c0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
210d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
210e0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
210f0 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
21100 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
21110 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
21120 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73  sing);.      ass
21130 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69  ert( pSrc->a[i+i
21140 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75  From].fg.isTabFu
21150 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  nc==0 );.      p
21160 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
21170 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
21180 0a 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e  .      iNewParen
21190 74 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  t = pSubSrc->a[i
211a0 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
211b0 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
211c0 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
211d0 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
211e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
211f0 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a  c->a[iFrom].fg.j
21200 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
21210 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
21220 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
21230 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
21240 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
21250 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
21260 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
21270 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
21280 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
21290 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
212a0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
212b0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
212c0 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
212d0 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
212e0 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
212f0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
21300 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
21310 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
21320 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
21330 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
21340 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
21350 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
21360 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
21370 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
21380 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21390 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
213a0 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
213b0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
213c0 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
213d0 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
213e0 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
213f0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
21400 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
21410 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
21420 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
21430 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
21440 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
21450 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
21460 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
21470 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
21480 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
21490 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
214a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
214b0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
214c0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
214d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
214e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
214f0 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
21500 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
21510 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
21520 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
21530 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d   }.    if( pSub-
21540 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
21550 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
21560 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72  int, any non-zer
21570 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  o iOrderByCol va
21580 6c 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68  lues indicate th
21590 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
215a0 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20  ORDER BY column 
215b0 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64  expression is id
215c0 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69  entical to the i
215d0 4f 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20  OrderByCol'th.  
215e0 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
215f0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  n returned by SE
21600 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
21610 53 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65  Sub. Since these
21620 20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a   values.      **
21630 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   do not necessar
21640 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  ily correspond t
21650 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c  o columns in SEL
21660 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50  ECT statement pP
21670 61 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20  arent,.      ** 
21680 7a 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65  zero them before
21690 20 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65   transfering the
216a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
216b0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
216c0 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68   ** Not doing th
216d0 69 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20  is may cause an 
216e0 65 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65  error if a subse
216f0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68  quent call to th
21700 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
21710 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
21720 20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f   flatten a compo
21730 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e  und sub-query in
21740 74 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20  to pParent.     
21750 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61   ** (the only wa
21760 79 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  y this can happe
21770 6e 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70  n is if the comp
21780 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69  ound sub-query i
21790 73 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65  s.      ** curre
217a0 6e 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75  ntly part of pSu
217b0 62 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69  b->pSrc). See ti
217c0 63 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66  cket [d11a6e908f
217d0 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  ].  */.      Exp
217e0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
217f0 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  = pSub->pOrderBy
21800 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
21810 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
21820 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
21830 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
21840 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
21850 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
21860 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
21870 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
21880 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21890 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  ( pSub->pPrior==
218a0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
218b0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  nt->pOrderBy = p
218c0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
218d0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
218e0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68  0;.    }.    pWh
218f0 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
21900 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
21910 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69  Where, 0);.    i
21920 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20  f( isLeftJoin>0 
21930 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e  ){.      setJoin
21940 45 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65  Expr(pWhere, iNe
21950 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  wParent);.    }.
21960 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79      if( subquery
21970 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61  IsAgg ){.      a
21980 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
21990 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20  pHaving==0 );.  
219a0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61      pParent->pHa
219b0 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e  ving = pParent->
219c0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
219d0 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
219e0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50  pWhere;.      pP
219f0 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
21a00 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
21a10 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  db, .          s
21a20 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
21a30 2c 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c  , pSub->pHaving,
21a40 20 30 29 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48   0), pParent->pH
21a50 61 76 69 6e 67 0a 20 20 20 20 20 20 29 3b 0a 20  aving.      );. 
21a60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
21a70 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  rent->pGroupBy==
21a80 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
21a90 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  nt->pGroupBy = s
21aa0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
21ab0 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f  p(db, pSub->pGro
21ac0 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65  upBy, 0);.    }e
21ad0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65  lse{.      pPare
21ae0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c  nt->pWhere = sql
21af0 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
21b00 70 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d  pWhere, pParent-
21b10 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a  >pWhere);.    }.
21b20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
21b30 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
21b40 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78       SubstContex
21b50 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61  t x;.      x.pPa
21b60 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
21b70 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69      x.iTable = i
21b80 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e  Parent;.      x.
21b90 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77  iNewTable = iNew
21ba0 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e  Parent;.      x.
21bb0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c  isLeftJoin = isL
21bc0 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78  eftJoin;.      x
21bd0 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e  .pEList = pSub->
21be0 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75  pEList;.      su
21bf0 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50  bstSelect(&x, pP
21c00 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d  arent, 0);.    }
21c10 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
21c20 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
21c30 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
21c40 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
21c50 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
21c60 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
21c70 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
21c80 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
21c90 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
21ca0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
21cb0 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
21cc0 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
21cd0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
21ce0 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
21cf0 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
21d00 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
21d10 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
21d20 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
21d30 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
21d40 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
21d50 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
21d60 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
21d70 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
21d80 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
21d90 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
21da0 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
21db0 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
21dc0 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
21dd0 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
21de0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
21df0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
21e00 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
21e10 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
21e20 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
21e30 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
21e40 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
21e50 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
21e60 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45  Sub1);..#if SELE
21e70 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
21e80 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
21e90 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
21ea0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
21eb0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
21ec0 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74  ,p,("After flatt
21ed0 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20  ening:\n"));.   
21ee0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
21ef0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
21f00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
21f10 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
21f20 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
21f30 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
21f40 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
21f50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
21f60 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  ) */....#if !def
21f70 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21f80 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
21f90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21fa0 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
21fb0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
21fc0 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
21fd0 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
21fe0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
21ff0 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
22000 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
22010 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
22020 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
22030 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
22040 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
22050 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
22060 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
22070 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
22080 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
22090 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
220a0 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
220b0 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
220c0 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
220d0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
220e0 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
220f0 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
22100 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
22110 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
22120 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
22130 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
22140 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
22150 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
22160 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
22170 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20  **.**   (1) The 
22180 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 61  inner query is a
22190 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 28 49  n aggregate.  (I
221a0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 27  n that case, we'
221b0 64 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  d really want.**
221c0 20 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74         to copy t
221d0 68 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63  he outer WHERE-c
221e0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f  lause terms onto
221f0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
22200 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  se of the.**    
22210 20 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20     inner query. 
22220 20 42 75 74 20 74 68 65 79 20 70 72 6f 62 61 62   But they probab
22230 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68  ly won't help th
22240 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f  ere so do not bo
22250 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  ther.).**.**   (
22260 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  2) The inner que
22270 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73  ry is the recurs
22280 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f  ive part of a co
22290 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
222a0 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  ssion..**.**   (
222b0 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  3) The inner que
222c0 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63  ry has a LIMIT c
222d0 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65  lause (since the
222e0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
222f0 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63  WHERE.**       c
22300 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67  lose would chang
22310 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66  e the meaning of
22320 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a   the LIMIT)..**.
22330 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e  **   (4) The inn
22340 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
22350 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
22360 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28   a LEFT JOIN.  (
22370 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  The caller.**   
22380 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69      enforces thi
22390 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69  s restriction si
223a0 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
223b0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65   does not have e
223c0 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69  nough.**       i
223d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e  nformation to kn
223e0 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  ow.).**.**   (5)
223f0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
22400 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
22410 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f  ginates in the O
22420 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
22430 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
22440 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a  LEFT JOIN..**.**
22450 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
22460 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
22470 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   and non-zero if
22480 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
22490 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72  RE clause.** ter
224a0 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
224b0 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75  d into the subqu
224c0 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
224d0 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  nt pushDownWhere
224e0 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
224f0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
22500 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
22510 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  (for malloc() an
22520 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  d error reportin
22530 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  g) */.  Select *
22540 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a  pSubq,        /*
22550 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77 68   The subquery wh
22560 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ose WHERE clause
22570 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e   is to be augmen
22580 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ted */.  Expr *p
22590 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
225a0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
225b0 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
225c0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
225d0 43 75 72 73 6f 72 20 20 20 20 20 20 20 20 20 20  Cursor          
225e0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
225f0 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  r of the subquer
22600 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  y */.){.  Expr *
22610 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  pNew;.  int nChn
22620 67 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  g = 0;.  Select 
22630 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
22640 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
22650 65 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  er compound SELE
22660 43 54 73 20 69 6e 20 70 53 75 62 71 20 2a 2f 0a  CTs in pSubq */.
22670 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20    if( pWhere==0 
22680 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
22690 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20  r(pX=pSubq; pX; 
226a0 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a  pX=pX->pPrior){.
226b0 20 20 20 20 69 66 28 20 28 70 58 2d 3e 73 65 6c      if( (pX->sel
226c0 46 6c 61 67 73 20 26 20 28 53 46 5f 41 67 67 72  Flags & (SF_Aggr
226d0 65 67 61 74 65 7c 53 46 5f 52 65 63 75 72 73 69  egate|SF_Recursi
226e0 76 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ve))!=0 ){.     
226f0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73   testcase( pX->s
22700 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
22710 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
22720 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73 65  testcase( pX->se
22730 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
22740 72 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20 74  rsive );.      t
22750 65 73 74 63 61 73 65 28 20 70 58 21 3d 70 53 75  estcase( pX!=pSu
22760 62 71 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  bq );.      retu
22770 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
22780 74 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28 32  tions (1) and (2
22790 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ) */.    }.  }. 
227a0 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d   if( pSubq->pLim
227b0 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  it!=0 ){.    ret
227c0 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
227d0 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d  ction (3) */.  }
227e0 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65  .  while( pWhere
227f0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
22800 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73      nChng += pus
22810 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
22820 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70  pParse, pSubq, p
22830 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20 69  Where->pRight, i
22840 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57 68  Cursor);.    pWh
22850 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
22860 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45  eft;.  }.  if( E
22870 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22880 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
22890 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  n) ) return 0; /
228a0 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 35 20  * restriction 5 
228b0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
228c0 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
228d0 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72  ant(pWhere, iCur
228e0 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e  sor) ){.    nChn
228f0 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g++;.    while( 
22900 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53  pSubq ){.      S
22910 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20  ubstContext x;. 
22920 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
22930 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
22940 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30  e->db, pWhere, 0
22950 29 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  );.      x.pPars
22960 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
22970 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43 75    x.iTable = iCu
22980 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e  rsor;.      x.iN
22990 65 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  ewTable = iCurso
229a0 72 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66  r;.      x.isLef
229b0 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20  tJoin = 0;.     
229c0 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62   x.pEList = pSub
229d0 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  q->pEList;.     
229e0 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70   pNew = substExp
229f0 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20  r(&x, pNew);.   
22a00 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65     pSubq->pWhere
22a10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
22a20 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  d(pParse->db, pS
22a30 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65  ubq->pWhere, pNe
22a40 77 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71 20  w);.      pSubq 
22a50 3d 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b  = pSubq->pPrior;
22a60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22a70 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e  urn nChng;.}.#en
22a80 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
22a90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
22aa0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
22ab0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
22ac0 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61  EW) */../*.** Ba
22ad0 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
22ae0 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e  nts of the AggIn
22af0 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  fo structure ind
22b00 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69  icated by the fi
22b10 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c  rst.** argument,
22b20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
22b30 68 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c  hecks if the fol
22b40 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
22b50 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
22b60 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a  query contains j
22b70 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67  ust a single agg
22b80 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
22b90 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67  .**    * the agg
22ba0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
22bb0 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20  is either min() 
22bc0 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a  or max(), and.**
22bd0 20 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65      * the argume
22be0 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  nt to the aggreg
22bf0 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ate function is 
22c00 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a  a column value..
22c10 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20  **.** If all of 
22c20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72  the above are tr
22c30 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f  ue, then WHERE_O
22c40 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48  RDERBY_MIN or WH
22c50 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a  ERE_ORDERBY_MAX.
22c60 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  ** is returned a
22c70 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41  s appropriate. A
22c80 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  lso, *ppMinMax i
22c90 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22ca0 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f  o the .** list o
22cb0 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
22cc0 65 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67  ed to the aggreg
22cd0 61 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ate before retur
22ce0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ning..**.** Or, 
22cf0 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  if the condition
22d00 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20  s above are not 
22d10 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69  met, *ppMinMax i
22d20 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
22d30 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  * WHERE_ORDERBY_
22d40 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e  NORMAL is return
22d50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ed..*/.static u8
22d60 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67   minMaxQuery(Agg
22d70 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20  Info *pAggInfo, 
22d80 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e  ExprList **ppMin
22d90 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74  Max){.  int eRet
22da0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
22db0 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20  _NORMAL;        
22dc0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
22dd0 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61  e */..  *ppMinMa
22de0 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67  x = 0;.  if( pAg
22df0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20  gInfo->nFunc==1 
22e00 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
22e10 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61  pr = pAggInfo->a
22e20 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f  Func[0].pExpr; /
22e30 2a 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63  * Aggregate func
22e40 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
22e50 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
22e60 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
22e70 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
22e80 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
22e90 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
22ea0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
22eb0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20  GG_FUNCTION );. 
22ec0 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
22ed0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
22ee0 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30  1 && pEList->a[0
22ef0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
22f00 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  AGG_COLUMN ){.  
22f10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
22f20 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75  zFunc = pExpr->u
22f30 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69  .zToken;.      i
22f40 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
22f50 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d  p(zFunc, "min")=
22f60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
22f70 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
22f80 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20  BY_MIN;.        
22f90 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
22fa0 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  st;.      }else 
22fb0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
22fc0 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29  mp(zFunc, "max")
22fd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
22fe0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
22ff0 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20  RBY_MAX;.       
23000 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c   *ppMinMax = pEL
23010 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ist;.      }.   
23020 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
23030 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c  ( *ppMinMax==0 |
23040 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e  | (*ppMinMax)->n
23050 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74  Expr==1 );.  ret
23060 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
23070 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
23080 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
23090 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
230a0 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
230b0 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
230c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
230d0 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
230e0 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
230f0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
23100 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
23110 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
23120 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
23130 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
23140 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
23150 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
23160 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
23170 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
23180 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
23190 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
231a0 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
231b0 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
231c0 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
231d0 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
231e0 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
231f0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
23200 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
23210 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
23220 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
23230 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
23240 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
23250 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
23260 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
23270 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
23280 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
23290 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
232a0 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
232b0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
232c0 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
232d0 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
232e0 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
232f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
23300 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
23310 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
23320 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
23330 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
23340 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
23350 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
23360 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
23370 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
23380 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
23390 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
233a0 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
233b0 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
233c0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
233d0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
233e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
233f0 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
23400 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
23410 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
23420 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
23430 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
23440 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
23450 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
23460 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
23470 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
23480 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
23490 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
234a0 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
234b0 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
234c0 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
234d0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
234e0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
234f0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
23500 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
23510 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
23520 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
23530 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
23540 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
23550 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
23560 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
23570 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
23580 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
23590 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
235a0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
235b0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
235c0 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
235d0 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
235e0 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
235f0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
23600 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
23610 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
23620 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
23630 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
23640 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
23650 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
23660 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
23670 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
23680 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
23690 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
236a0 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
236b0 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
236c0 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
236d0 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
236e0 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
236f0 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
23700 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
23710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
23720 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23730 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
23740 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
23750 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
23760 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
23770 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
23780 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
23790 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
237a0 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
237b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
237c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
237d0 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
237e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
237f0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
23800 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
23810 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
23820 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
23830 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
23840 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
23850 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
23860 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
23870 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
23880 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
23890 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
238a0 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
238b0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
238c0 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
238d0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
238e0 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
238f0 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
23900 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
23910 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
23920 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
23930 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
23940 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
23950 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
23960 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
23970 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
23980 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
23990 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
239a0 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
239b0 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
239c0 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
239d0 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
239e0 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
239f0 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
23a00 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
23a10 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
23a20 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
23a30 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
23a40 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
23a50 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
23a60 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
23a70 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
23a80 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
23a90 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
23aa0 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
23ab0 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
23ac0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
23ad0 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
23ae0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
23af0 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
23b00 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
23b10 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
23b20 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
23b30 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
23b40 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
23b50 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
23b60 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
23b70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
23b80 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
23b90 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
23ba0 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
23bb0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
23bc0 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
23bd0 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
23be0 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
23bf0 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
23c00 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
23c10 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23c20 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
23c30 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
23c40 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
23c50 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
23c60 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
23c70 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
23c80 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
23c90 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
23ca0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23cb0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
23cc0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
23cd0 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
23ce0 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
23cf0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
23d00 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
23d10 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
23d20 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
23d30 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
23d40 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23d50 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
23d60 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
23d70 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
23d80 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
23d90 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
23da0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
23db0 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
23dc0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
23dd0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
23de0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
23df0 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
23e00 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
23e10 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
23e20 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
23e30 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
23e40 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
23e50 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
23e60 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
23e70 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
23e80 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
23e90 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
23ea0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
23eb0 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
23ec0 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
23ed0 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
23ee0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
23ef0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
23f00 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
23f10 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
23f20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
23f30 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
23f40 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
23f50 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
23f60 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
23f70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
23f80 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
23f90 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
23fa0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
23fb0 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70  ->pWith = 0;.  p
23fc0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
23fd0 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
23fe0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
23ff0 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
24000 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  d)==0 );.  p->se
24010 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e  lFlags |= SF_Con
24020 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74  verted;.  assert
24030 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d  ( pNew->pPrior!=
24040 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  0 );.  pNew->pPr
24050 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
24060 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  w;.  pNew->pLimi
24070 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  t = 0;.  pNew->p
24080 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65  Offset = 0;.  re
24090 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
240a0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e;.}../*.** Chec
240b0 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
240c0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
240d0 20 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65   pFrom has table
240e0 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e  -valued function
240f0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  .** arguments.  
24100 49 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76  If it does, leav
24110 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
24120 67 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ge in pParse and
24130 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
24140 65 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d  ero, since pFrom
24150 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
24160 74 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61  to be a table-va
24170 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  lued function..*
24180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e  /.static int can
24190 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61  notBeFunction(Pa
241a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
241b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
241c0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
241d0 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pFrom->fg.isTabF
241e0 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  unc ){.    sqlit
241f0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
24200 65 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20  e, "'%s' is not 
24210 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72  a function", pFr
24220 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  om->zName);.    
24230 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
24240 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
24250 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24260 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  _CTE./*.** Argum
24270 65 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68  ent pWith (which
24280 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f   may be NULL) po
24290 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64  ints to a linked
242a0 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20   list of nested 
242b0 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74  .** WITH context
242c0 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f  s, from inner to
242d0 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74   outermost. If t
242e0 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
242f0 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20  ied by .** FROM 
24300 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70  clause element p
24310 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61  Item is really a
24320 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78   common-table-ex
24330 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a  pression (CTE) .
24340 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  ** then return a
24350 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24360 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66  CTE definition f
24370 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f  or that table. O
24380 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75  therwise.** retu
24390 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  rn NULL..**.** I
243a0 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  f a non-NULL val
243b0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ue is returned, 
243c0 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74  set *ppContext t
243d0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57  o point to the W
243e0 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ith.** object th
243f0 61 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  at the returned 
24400 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  CTE belongs to..
24410 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
24420 20 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68   Cte *searchWith
24430 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c  (.  With *pWith,
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69      /* Current i
24460 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c  nnermost WITH cl
24470 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
24480 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24490 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f  Item,     /* FRO
244a0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
244b0 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20   to resolve */. 
244c0 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78   With **ppContex
244d0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
244e0 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c   /* OUT: WITH cl
244f0 61 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75  ause return valu
24500 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
24510 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
24520 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49  *zName;.  if( pI
24530 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
24540 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49  0 && (zName = pI
24550 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  tem->zName)!=0 )
24560 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20  {.    With *p;. 
24570 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20     for(p=pWith; 
24580 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b  p; p=p->pOuter){
24590 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
245a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
245b0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
245c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
245d0 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20  3StrICmp(zName, 
245e0 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  p->a[i].zName)==
245f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 ){.          *
24600 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20  ppContext = p;. 
24610 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
24620 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  &p->a[i];.      
24630 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24640 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
24650 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65  ;.}../* The code
24660 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74   generator maint
24670 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20  ains a stack of 
24680 61 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75  active WITH clau
24690 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ses.** with the 
246a0 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20  inner-most WITH 
246b0 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20  clause being at 
246c0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73  the top of the s
246d0 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tack..**.** This
246e0 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20   routine pushes 
246f0 74 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20  the WITH clause 
24700 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
24710 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
24720 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66   onto the top of
24730 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61   the stack. If a
24740 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73  rgument bFree is
24750 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73   true, then this
24760 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20  .** WITH clause 
24770 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f  will never be po
24780 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  pped from the st
24790 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
247a0 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  e it.** should b
247b0 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
247c0 74 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  th the Parse obj
247d0 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61  ect. In other ca
247e0 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72  ses, when.** bFr
247f0 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20  ee==0, the With 
24800 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66  object will be f
24810 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  reed along with 
24820 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73  the SELECT .** s
24830 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68  tatement with wh
24840 69 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69  ich it is associ
24850 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
24860 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61  lite3WithPush(Pa
24870 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74  rse *pParse, Wit
24880 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72  h *pWith, u8 bFr
24890 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62  ee){.  assert( b
248a0 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72  Free==0 || (pPar
248b0 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20  se->pWith==0 && 
248c0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
248d0 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  ree==0) );.  if(
248e0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73   pWith ){.    as
248f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
24900 69 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith!=pWith );.  
24910 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20    pWith->pOuter 
24920 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b  = pParse->pWith;
24930 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
24940 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20  th = pWith;.    
24950 69 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72  if( bFree ) pPar
24960 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20  se->pWithToFree 
24970 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a  = pWith;.  }.}..
24980 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24990 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72  ion checks if ar
249a0 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66  gument pFrom ref
249b0 65 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63  ers to a CTE dec
249c0 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57  lared by .** a W
249d0 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ITH clause on th
249e0 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c  e stack currentl
249f0 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  y maintained by 
24a00 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c  the parser. And,
24a10 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79  .** if currently
24a20 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54   processing a CT
24a30 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66  E expression, if
24a40 20 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69   it is a recursi
24a50 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ve.** reference 
24a60 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43  to the current C
24a70 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  TE..**.** If pFr
24a80 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69  om falls into ei
24a90 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
24aa0 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65  categories above
24ab0 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a  , pFrom->pTab.**
24ac0 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
24ad0 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
24ae0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65  accordingly. The
24af0 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63   caller should c
24b00 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e  heck.** (pFrom->
24b10 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65  pTab!=0) to dete
24b20 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
24b30 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75   not a successfu
24b40 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66  l match.** was f
24b50 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ound..**.** Whet
24b60 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74  her or not a mat
24b70 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c  ch is found, SQL
24b80 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
24b90 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a  ed if no error.*
24ba0 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  * occurs. If an 
24bb0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
24bc0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
24bd0 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
24be0 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e  the.** parser an
24bf0 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64  d some error cod
24c00 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
24c10 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
24c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
24c30 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c  ithExpand(.  Wal
24c40 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20  ker *pWalker, . 
24c50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
24c60 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20  item *pFrom.){. 
24c70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
24c80 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
24c90 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
24ca0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
24cb0 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65  struct Cte *pCte
24cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24cd0 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28  /* Matched CTE (
24ce0 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61  or NULL if no ma
24cf0 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a  tch) */.  With *
24d00 70 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  pWith;          
24d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54            /* WIT
24d20 48 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43  H clause that pC
24d30 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  te belongs to */
24d40 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  ..  assert( pFro
24d50 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20  m->pTab==0 );.. 
24d60 20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69   pCte = searchWi
24d70 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  th(pParse->pWith
24d80 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29  , pFrom, &pWith)
24d90 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a  ;.  if( pCte ){.
24da0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
24db0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
24dc0 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63  EList;.    Selec
24dd0 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c  t *pSel;.    Sel
24de0 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20  ect *pLeft;     
24df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
24e00 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ft-most SELECT s
24e10 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
24e20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76  int bMayRecursiv
24e30 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
24e40 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e   True if compoun
24e50 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f  d joined by UNIO
24e60 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57  N [ALL] */.    W
24e70 69 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b  ith *pSavedWith;
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24e90 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
24ea0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a   pParse->pWith *
24eb0 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74  /..    /* If pCt
24ec0 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f  e->zCteErr is no
24ed0 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  n-NULL at this p
24ee0 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  oint, then this 
24ef0 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20  is an illegal.  
24f00 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72    ** recursive r
24f10 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20  eference to CTE 
24f20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65  pCte. Leave an e
24f30 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61  rror in pParse a
24f40 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
24f50 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d   early. If pCte-
24f60 3e 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c  >zCteErr is NULL
24f70 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e  , then this is n
24f80 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72  ot a recursive r
24f90 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a  eference..    **
24fa0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70   In this case, p
24fb0 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20  roceed.  */.    
24fc0 69 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72  if( pCte->zCteEr
24fd0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
24fe0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
24ff0 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  e, pCte->zCteErr
25000 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
25010 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25020 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
25030 0a 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42  .    if( cannotB
25040 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
25050 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
25060 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25070 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
25080 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
25090 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
250a0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
250b0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
250c0 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
250d0 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
250e0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
250f0 72 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54  rt;.    pTab->nT
25100 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  abRef = 1;.    p
25110 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
25120 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
25130 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
25140 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
25150 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
25160 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
25170 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
25180 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
25190 35 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62  576) );.    pTab
251a0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
251b0 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f  _Ephemeral | TF_
251c0 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
251d0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
251e0 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
251f0 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
25200 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
25210 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
25220 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
25230 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
25240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
25250 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  rom->pSelect );.
25260 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
25270 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72   this is a recur
25280 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20  sive CTE. */.   
25290 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70   pSel = pFrom->p
252a0 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79  Select;.    bMay
252b0 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53  Recursive = ( pS
252c0 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  el->op==TK_ALL |
252d0 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55  | pSel->op==TK_U
252e0 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20  NION );.    if( 
252f0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
25300 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
25310 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
25320 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  c = pFrom->pSele
25330 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  ct->pSrc;.      
25340 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
25350 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
25360 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
25370 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
25380 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  = &pSrc->a[i];. 
25390 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
253a0 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a  ->zDatabase==0 .
253b0 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65           && pIte
253c0 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20  m->zName!=0 .   
253d0 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
253e0 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d  te3StrICmp(pItem
253f0 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a  ->zName, pCte->z
25400 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20  Name).          
25410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
25420 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  em->pTab = pTab;
25430 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
25440 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65  ->fg.isRecursive
25450 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
25460 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b  pTab->nTabRef++;
25470 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d  .          pSel-
25480 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
25490 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20  Recursive;.     
254a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
254b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
254c0 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65  one recursive re
254d0 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69  ference is permi
254e0 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66  tted. */ .    if
254f0 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e  ( pTab->nTabRef>
25500 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
25510 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20  e3ErrorMsg(.    
25520 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d        pParse, "m
25530 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63  ultiple referenc
25540 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20  es to recursive 
25550 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65  table: %s", pCte
25560 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
25570 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25580 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
25590 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  }.    assert( pT
255a0 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c  ab->nTabRef==1 |
255b0 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  | ((pSel->selFla
255c0 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
255d0 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65   && pTab->nTabRe
255e0 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43  f==2 ));..    pC
255f0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63  te->zCteErr = "c
25600 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63  ircular referenc
25610 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76  e: %s";.    pSav
25620 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d  edWith = pParse-
25630 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
25640 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
25650 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  h;.    if( bMayR
25660 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
25670 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
25680 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
25690 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
256a0 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20  Prior->pWith==0 
256b0 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
256c0 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70  >pWith = pSel->p
256d0 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69  With;.      sqli
256e0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
256f0 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a  alker, pPrior);.
25700 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57        pPrior->pW
25710 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ith = 0;.    }el
25720 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
25730 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
25740 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
25750 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  }.    pParse->pW
25760 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20  ith = pWith;..  
25770 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
25780 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
25790 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
257a0 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
257b0 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
257c0 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
257d0 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
257e0 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45  if( pEList && pE
257f0 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74  List->nExpr!=pCt
25800 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20  e->pCols->nExpr 
25810 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25820 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
25830 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
25840 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25   %d values for %
25850 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20  d columns",.    
25860 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e          pCte->zN
25870 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ame, pEList->nEx
25880 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr, pCte->pCols-
25890 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  >nExpr.        )
258a0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
258b0 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
258c0 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65  With;.        re
258d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
258e0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
258f0 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e   pEList = pCte->
25900 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  pCols;.    }..  
25910 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
25920 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
25930 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54  rse, pEList, &pT
25940 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d  ab->nCol, &pTab-
25950 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20  >aCol);.    if( 
25960 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b  bMayRecursive ){
25970 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d  .      if( pSel-
25980 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
25990 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
259a0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
259b0 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  r = "multiple re
259c0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
259d0 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d  es: %s";.      }
259e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
259f0 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72  te->zCteErr = "r
25a00 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
25a10 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79  ce in a subquery
25a20 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20  : %s";.      }. 
25a30 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
25a40 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
25a50 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSel);.    }.   
25a60 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
25a70 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   0;.    pParse->
25a80 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
25a90 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  th;.  }..  retur
25aa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
25ab0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
25ac0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
25ad0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
25ae0 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68 65  CT passed as the
25af0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
25b00 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74   has an associat
25b10 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75  ed WITH .** clau
25b20 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20  se, pop it from 
25b30 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64  the stack stored
25b40 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
25b50 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  Parse object..**
25b60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
25b70 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  n is used as the
25b80 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
25b90 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a  2() callback by.
25ba0 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
25bb0 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61  Expand() when wa
25bc0 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74  lking a SELECT t
25bd0 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  ree to resolve t
25be0 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e  able.** names an
25bf0 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61  d other FROM cla
25c00 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a  use elements. .*
25c10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
25c20 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b  lectPopWith(Walk
25c30 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
25c40 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
25c50 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b   *pParse = pWalk
25c60 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66  er->pParse;.  if
25c70 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20  ( pParse->pWith 
25c80 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  && p->pPrior==0 
25c90 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69  ){.    With *pWi
25ca0 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f  th = findRightmo
25cb0 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20  st(p)->pWith;.  
25cc0 20 20 69 66 28 20 70 57 69 74 68 21 3d 30 20 29    if( pWith!=0 )
25cd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25ce0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70  pParse->pWith==p
25cf0 57 69 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50  With );.      pP
25d00 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
25d10 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20  ith->pOuter;.   
25d20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
25d30 64 65 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70  define selectPop
25d40 57 69 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  With 0.#endif../
25d50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25d60 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61  e is a Walker ca
25d70 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61  llback for "expa
25d80 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20  nding" a SELECT 
25d90 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45  statement..** "E
25da0 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20  xpanding" means 
25db0 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  to do the follow
25dc0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ing:.**.**    (1
25dd0 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42  )  Make sure VDB
25de0 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
25df0 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69 67   have been assig
25e00 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20  ned to every.** 
25e10 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20          element 
25e20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
25e30 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
25e40 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54    Fill in the pT
25e50 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62  abList->a[].pTab
25e60 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53   fields in the S
25e70 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20  rcList that .** 
25e80 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 73 20          defines 
25e90 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68  FROM clause.  Wh
25ea0 65 6e 20 76 69 65 77 73 20 61 70 70 65 61 72 20  en views appear 
25eb0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
25ec0 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  se,.**         f
25ed0 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ill pTabList->a[
25ee0 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68 20 61  ].pSelect with a
25ef0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   copy of the SEL
25f00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  ECT statement.**
25f10 20 20 20 20 20 20 20 20 20 74 68 61 74 20 69 6d           that im
25f20 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65  plements the vie
25f30 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61  w.  A copy is ma
25f40 64 65 20 6f 66 20 74 68 65 20 76 69 65 77 27 73  de of the view's
25f50 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20   SELECT.**      
25f60 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20     statement so 
25f70 74 68 61 74 20 77 65 20 63 61 6e 20 66 72 65 65  that we can free
25f80 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c  ly modify or del
25f90 65 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ete that stateme
25fa0 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69  nt.**         wi
25fb0 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61  thout worrying a
25fc0 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20  bout messing up 
25fd0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 72  the persistent r
25fe0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a  epresentation.**
25ff0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
26000 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  view..**.**    (
26010 33 29 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f  3)  Add terms to
26020 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26030 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65  e to accommodate
26040 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79   the NATURAL key
26050 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  word.**         
26060 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65  on joins and the
26070 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
26080 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a  ause of joins..*
26090 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61  *.**    (4)  Sca
260a0 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f  n the list of co
260b0 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
260c0 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74 29  ult set (pEList)
260d0 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   looking.**     
260e0 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65      for instance
260f0 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65  s of the "*" ope
26100 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42  rator or the TAB
26110 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LE.* operator..*
26120 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f 75  *         If fou
26130 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20  nd, expand each 
26140 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79 20  "*" to be every 
26150 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20  column in every 
26160 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20  table.**        
26170 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20   and TABLE.* to 
26180 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
26190 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a  in TABLE..**.*/.
261a0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63  static int selec
261b0 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72  tExpander(Walker
261c0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
261d0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
261e0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
261f0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
26200 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69  i, j, k;.  SrcLi
26210 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
26220 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
26230 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
26240 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
26250 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
26260 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
26270 70 72 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c  pr *pE, *pRight,
26280 20 2a 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73   *pExpr;.  u16 s
26290 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c  elFlags = p->sel
262a0 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c  Flags;..  p->sel
262b0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61  Flags |= SF_Expa
262c0 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e  nded;.  if( db->
262d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b  mallocFailed  ){
262e0 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
262f0 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28  Abort;.  }.  if(
26300 20 4e 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d   NEVER(p->pSrc==
26310 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20  0) || (selFlags 
26320 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
26330 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
26340 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
26350 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
26360 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
26370 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28  p->pEList;.  if(
26380 20 70 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20   p->pWith ){.   
26390 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
263a0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74  (pParse, p->pWit
263b0 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  h, 0);.  }..  /*
263c0 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
263d0 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
263e0 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
263f0 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
26400 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
26410 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
26420 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
26430 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
26440 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
26450 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
26460 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
26470 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
26480 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
26490 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
264a0 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
264b0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
264c0 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
264d0 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
264e0 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
264f0 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
26500 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
26510 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
26520 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
26530 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
26540 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
26550 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
26560 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
26570 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
26580 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
26590 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
265a0 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
265b0 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70  e==0 || pFrom->p
265c0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
265d0 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65  ( pFrom->fg.isRe
265e0 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e  cursive ) contin
265f0 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
26600 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
26610 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26620 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66  _OMIT_CTE.    if
26630 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57 61  ( withExpand(pWa
26640 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72  lker, pFrom) ) r
26650 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
26660 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
26670 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23  pTab ) {} else.#
26680 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46  endif.    if( pF
26690 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b  rom->zName==0 ){
266a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
266b0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
266c0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
266d0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
266e0 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  t;.      /* A su
266f0 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
26700 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
26710 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
26720 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20  assert( pSel!=0 
26730 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26740 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
26750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
26760 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
26770 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20  Walker, pSel) ) 
26780 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
26790 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
267a0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
267b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
267c0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
267d0 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
267e0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
267f0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26800 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
26810 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   1;.      pTab->
26820 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
26830 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
26840 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64  te_sq_%p", (void
26850 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77  *)pTab);.      w
26860 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
26870 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65  or ){ pSel = pSe
26880 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20  l->pPrior; }.   
26890 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
268a0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
268b0 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69  arse, pSel->pELi
268c0 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26  st,&pTab->nCol,&
268d0 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
268e0 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
268f0 20 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d   -1;.      pTab-
26900 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
26910 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
26920 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
26930 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20  48576) );.      
26940 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
26950 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
26960 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
26970 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72  {.      /* An or
26980 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20  dinary table or 
26990 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65  view name in the
269a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
269b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
269c0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
269d0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
269e0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
269f0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
26a00 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72  m(pParse, 0, pFr
26a10 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  om);.      if( p
26a20 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
26a30 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26a40 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
26a50 65 66 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef>=0xffff ){.  
26a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
26a70 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
26a80 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
26a90 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
26aa0 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
26ab0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
26ac0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
26ad0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
26ae0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
26af0 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
26b00 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
26b10 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  f++;.      if( !
26b20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
26b30 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  && cannotBeFunct
26b40 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f  ion(pParse, pFro
26b50 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  m) ){.        re
26b60 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26b70 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66        }.#if !def
26b80 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
26b90 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
26ba0 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
26bb0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
26bc0 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
26bd0 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d  l(pTab) || pTab-
26be0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
26bf0 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20      i16 nCol;.  
26c00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26c10 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
26c20 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
26c30 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
26c40 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
26c50 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
26c60 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
26c70 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
26c80 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
26c90 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
26ca0 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
26cb0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
26cc0 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e  tSetName(pFrom->
26cd0 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a  pSelect, pTab->z
26ce0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  Name);.        n
26cf0 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  Col = pTab->nCol
26d00 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ;.        pTab->
26d10 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  nCol = -1;.     
26d20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
26d30 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
26d40 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
26d50 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f         pTab->nCo
26d60 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  l = nCol;.      
26d70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
26d80 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
26d90 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
26da0 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
26db0 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
26dc0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
26dd0 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
26de0 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
26df0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
26e00 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
26e10 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
26e20 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
26e30 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
26e40 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
26e50 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
26e60 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
26e70 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
26e80 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
26e90 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
26ea0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26eb0 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
26ec0 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
26ed0 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
26ee0 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
26ef0 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
26f00 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
26f10 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
26f20 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
26f30 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
26f40 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
26f50 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
26f60 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
26f70 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
26f80 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
26f90 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52  ith the TK_ASTER
26fa0 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ISK operator for
26fb0 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
26fc0 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
26fd0 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e  olumn.  ** list.
26fe0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
26ff0 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
27000 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
27010 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70  STERISK.  ** exp
27020 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
27030 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20  and each one to 
27040 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
27050 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20  columns in.  ** 
27060 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
27070 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
27080 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
27090 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
270a0 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
270b0 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
270c0 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
270d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
270e0 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
270f0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d  ; k++){.    pE =
27100 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
27110 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
27120 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op==TK_ASTERISK
27130 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
27140 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
27150 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
27160 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
27170 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
27180 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
27190 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
271a0 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
271b0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
271c0 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
271d0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  Right->op==TK_AS
271e0 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a  TERISK ) break;.
271f0 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
27200 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
27210 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
27220 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
27230 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
27240 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
27250 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
27260 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
27270 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
27280 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
27290 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
272a0 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
272b0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
272c0 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
272d0 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
272e0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
272f0 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
27300 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
27310 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
27320 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
27330 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
27340 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
27350 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
27360 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
27370 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
27390 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
273a0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
273b0 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ==0;..    for(k=
273c0 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
273d0 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
273e0 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
273f0 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
27400 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pE->pRight;.    
27410 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
27420 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
27430 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
27440 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53  f( pE->op!=TK_AS
27450 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26  TERISK.       &&
27460 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54   (pE->op!=TK_DOT
27470 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d   || pRight->op!=
27480 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20  TK_ASTERISK).   
27490 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
274a0 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72   This particular
274b0 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73   expression does
274c0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
274d0 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20  expanded..      
274e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
274f0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
27500 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
27510 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78  , pNew, a[k].pEx
27520 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
27530 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
27540 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
27550 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
27560 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
27570 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
27580 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
27590 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61  Span = a[k].zSpa
275a0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b  n;.          a[k
275b0 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ].zName = 0;.   
275c0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61         a[k].zSpa
275d0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  n = 0;.        }
275e0 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45  .        a[k].pE
275f0 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  xpr = 0;.      }
27600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
27610 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
27620 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
27630 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
27640 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
27650 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
27660 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
27670 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
27680 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
27690 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
276a0 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
276b0 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  *zTName = 0;    
276c0 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
276d0 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
276e0 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
276f0 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
27700 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
27710 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  E->pLeft!=0 );. 
27720 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27730 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
27740 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f  y(pE->pLeft, EP_
27750 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
27760 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20         zTName = 
27770 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  pE->pLeft->u.zTo
27780 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ken;.        }. 
27790 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20         for(i=0, 
277a0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
277b0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
277c0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
277d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61  +){.          Ta
277e0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
277f0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
27800 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
27810 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
27820 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
27830 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72   *zTabName = pFr
27840 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  om->zAlias;.    
27850 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
27860 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20   *zSchemaName = 
27870 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
27880 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
27890 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
278a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
278b0 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e  TabName = pTab->
278c0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
278d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
278e0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
278f0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
27900 20 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30       if( pSub==0
27910 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c   || (pSub->selFl
27920 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
27930 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rom)==0 ){.     
27940 20 20 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b         pSub = 0;
27950 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27960 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74   zTName && sqlit
27970 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65  e3StrICmp(zTName
27980 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29  , zTabName)!=0 )
27990 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
279a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
279b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
279c0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
279d0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
279e0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
279f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
27a00 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62  SchemaName = iDb
27a10 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44  >=0 ? db->aDb[iD
27a20 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a  b].zDbSName : "*
27a30 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
27a40 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
27a50 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
27a60 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
27a70 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
27a80 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
27a90 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
27aa0 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
27ab0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
27ac0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
27ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
27ae0 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
27af0 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
27b00 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
27b10 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
27b20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
27b30 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
27b40 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
27b50 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
27b60 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
27b70 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
27b80 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
27b90 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
27ba0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
27bb0 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
27bc0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
27bd0 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
27be0 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
27bf0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
27c00 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
27c10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
27c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
27c30 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
27c40 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
27c50 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20  ', omit it from 
27c60 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20  the expanded.   
27c70 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75           ** resu
27c80 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65  lt-set list unle
27c90 73 73 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ss the SELECT ha
27ca0 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65  s the SF_Include
27cb0 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20  Hidden.         
27cc0 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20     ** bit set.. 
27cd0 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
27ce0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27cf0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27d00 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d  IncludeHidden)==
27d10 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  0.             &
27d20 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e  & IsHiddenColumn
27d30 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29  (&pTab->aCol[j])
27d40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b   .            ){
27d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
27d60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
27d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27d80 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31     tableSeen = 1
27d90 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ;..            i
27da0 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65  f( i>0 && zTName
27db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27dc0 20 20 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d       if( (pFrom-
27dd0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
27de0 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
27e00 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
27e10 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
27e20 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e50 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
27e60 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
27e70 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
27e80 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
27e90 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
27ea0 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
27eb0 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
27ec0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
27ed0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
27ee0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27ef0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
27f00 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
27f10 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
27f20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27f30 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
27f40 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
27f50 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
27f60 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
27f70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
27f80 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
27f90 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
27fa0 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
27fc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
27fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27fe0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27ff0 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
28000 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
28010 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
28020 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
28030 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
28040 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
28050 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
28060 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
28070 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
28090 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
280a0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
280b0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
280c0 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
280d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
280e0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
280f0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
28100 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
28110 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
28120 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e      if( zSchemaN
28130 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
28140 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
28150 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
28160 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d  K_ID, zSchemaNam
28170 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28180 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
28190 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
281a0 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
281b0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
281c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
281d0 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
281e0 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
281f0 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
28200 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
28210 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
28220 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28240 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
28250 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
28260 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
28270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28280 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
28290 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
282a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
282b0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
282c0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
282d0 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
282e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
282f0 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26  lite3TokenInit(&
28300 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61  sColname, zColna
28310 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
28320 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
28330 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
28340 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
28350 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
28360 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d   if( pNew && (p-
28370 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
28380 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
28390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
283a0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
283b0 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d  tem *pX = &pNew-
283c0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
283d0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
283e0 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20   if( pSub ){.   
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
28400 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
28410 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75  DbStrDup(db, pSu
28420 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
28430 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
28440 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
28450 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
28460 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28480 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
28490 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
284a0 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22  f(db, "%s.%s.%s"
284b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
284c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63               zSc
284e0 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  hemaName, zTabNa
284f0 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
28510 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
28520 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
28530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28540 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e         pX->bSpan
28550 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  IsTab = 1;.     
28560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28570 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
28580 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b  ee(db, zToFree);
28590 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
285a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
285b0 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
285c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
285d0 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
285e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
285f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
28600 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
28610 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
28620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28640 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
28650 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
28660 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
28670 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28690 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
286a0 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
286b0 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
286c0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
286d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
286e0 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
286f0 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
28700 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
28710 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
28720 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
28730 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28740 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
28750 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
28760 74 20 73 65 74 22 29 3b 0a 20 20 20 20 72 65 74  t set");.    ret
28770 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
28780 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
28790 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
287a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
287b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
287c0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
287d0 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
287e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
287f0 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
28800 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
28810 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
28820 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
28830 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
28840 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
28850 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
28860 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
28870 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
28880 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
28890 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
288a0 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
288b0 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
288c0 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
288d0 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
288e0 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
288f0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
28900 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ree..*/.int sqli
28910 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  te3ExprWalkNoop(
28920 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
28930 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
28940 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
28950 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
28960 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
28970 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
28980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  .}../*.** No-op 
28990 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
289a0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
289b0 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  r for SELECT sta
289c0 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75 62 71  tements..** subq
289d0 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
289e0 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20  er tree..*/.int 
289f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
28a00 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
28a10 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
28a20 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
28a30 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
28a40 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
28a50 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
28a60 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 20  ontinue;.}..#if 
28a70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
28a80 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65 72 74  ** Always assert
28a90 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63 74 43  .  This xSelectC
28aa0 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65 6d 65  allback2 impleme
28ab0 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73 20 74  ntation proves t
28ac0 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65 6c 65  hat the.** xSele
28ad0 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73 20 6e  ctCallback2 is n
28ae0 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f  ever invoked..*/
28af0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
28b00 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32 28 57  ectWalkAssert2(W
28b10 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
28b20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32  Select *NotUsed2
28b30 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
28b40 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
28b50 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61 73 73  NotUsed2);.  ass
28b60 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65 6e 64  ert( 0 );.}.#end
28b70 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  if./*.** This ro
28b80 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
28b90 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
28ba0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
28bb0 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
28bc0 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
28bd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
28be0 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
28bf0 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
28c00 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
28c10 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
28c20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
28c30 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
28c40 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
28c50 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
28c60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
28c70 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
28c80 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
28c90 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
28ca0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
28cb0 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
28cc0 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
28cd0 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
28ce0 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
28cf0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
28d00 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
28d10 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
28d20 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
28d30 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
28d40 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
28d50 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
28d60 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
28d70 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
28d80 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
28d90 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
28da0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
28db0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
28dc0 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
28dd0 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
28de0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
28df0 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 45 78  alker w;.  w.xEx
28e00 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
28e10 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
28e20 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
28e30 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61  Parse;.  if( pPa
28e40 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
28e50 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
28e60 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
28e70 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
28e80 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
28e90 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
28ea0 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ck2 = 0;.    sql
28eb0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
28ec0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  w, pSelect);.  }
28ed0 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
28ee0 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70  back = selectExp
28ef0 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65  ander;.  w.xSele
28f00 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
28f10 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73  lectPopWith;.  s
28f20 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
28f30 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d  (&w, pSelect);.}
28f40 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
28f50 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
28f60 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
28f70 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
28f80 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20  llback callback 
28f90 66 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53  for the sqlite3S
28fa0 65 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a  electTypeInfo().
28fb0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ** interface..**
28fc0 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f  .** For each FRO
28fd0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
28fe0 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54  y, add Column.zT
28ff0 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a  ype and Column.z
29000 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  Coll.** informat
29010 69 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ion to the Table
29020 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
29030 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72  represents the r
29040 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20  esult set.** of 
29050 74 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a  that subquery..*
29060 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
29070 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
29080 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
29090 75 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73  ult set was cons
290a0 74 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65  tructed.** by se
290b0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62  lectExpander() b
290c0 75 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ut the type and 
290d0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
290e0 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65  ation was omitte
290f0 64 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69  d.** at that poi
29100 6e 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74  nt because ident
29110 69 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79  ifiers had not y
29120 65 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  et been resolved
29130 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
29140 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
29150 65 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65  er identifier re
29160 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
29170 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41  tic void selectA
29180 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e  ddSubqueryTypeIn
29190 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  fo(Walker *pWalk
291a0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
291b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
291c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c  .  int i;.  SrcL
291d0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
291e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
291f0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20  item *pFrom;..  
29200 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
29210 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
29220 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  d );.  assert( (
29230 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
29240 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
29250 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
29260 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49  s |= SF_HasTypeI
29270 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  nfo;.  pParse = 
29280 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
29290 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
292a0 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >pSrc;.  for(i=0
292b0 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
292c0 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
292d0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
292e0 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  m++){.    Table 
292f0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
29300 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
29310 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20   pTab!=0 );.    
29320 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
29330 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
29340 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
29350 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
29360 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
29370 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
29380 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
29390 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
293a0 6c 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20  lect;.      if( 
293b0 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pSel ){.        
293c0 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
293d0 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
293e0 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
293f0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
29400 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
29410 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
29420 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
29430 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
29440 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
29450 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
29460 64 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64  dds datatype and
29470 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
29480 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nce information 
29490 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20  to.** the Table 
294a0 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c  structures of al
294b0 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  l FROM-clause su
294c0 62 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a  bqueries in a.**
294d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
294e0 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69  t..**.** Use thi
294f0 73 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20  s routine after 
29500 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  name resolution.
29510 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
29520 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
29530 54 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a  TypeInfo(Parse *
29540 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
29550 70 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65  pSelect){.#ifnde
29560 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
29570 42 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20  BQUERY.  Walker 
29580 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  w;.  w.xSelectCa
29590 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
295a0 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a  SelectWalkNoop;.
295b0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
295c0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64  ack2 = selectAdd
295d0 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
295e0 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
295f0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ack = sqlite3Exp
29600 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
29610 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
29620 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
29630 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
29640 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
29650 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29660 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
29670 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
29680 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
29690 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
296a0 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
296b0 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
296c0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
296d0 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
296e0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
296f0 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
29700 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
29710 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
29720 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
29730 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
29740 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
29750 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
29760 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
29770 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
29780 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
29790 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
297a0 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
297b0 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
297c0 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
297d0 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
297e0 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
297f0 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
29800 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
29810 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
29820 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
29830 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
29840 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
29850 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
29860 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
29870 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
29880 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
29890 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
298a0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
298b0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
298c0 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
298d0 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
298e0 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
298f0 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
29900 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
29910 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
29920 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
29930 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
29940 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
29950 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  >db;.  if( db->m
29960 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
29970 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73  turn;.  if( p->s
29980 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
29990 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
299a0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
299b0 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c  ctExpand(pParse,
299c0 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   p);.  if( pPars
299d0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
299e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
299f0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52  turn;.  sqlite3R
29a00 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
29a10 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  s(pParse, p, pOu
29a20 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50  terNC);.  if( pP
29a30 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
29a40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29a50 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
29a60 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
29a70 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  nfo(pParse, p);.
29a80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
29a90 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
29aa0 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
29ab0 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
29ac0 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
29ad0 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
29ae0 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
29af0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
29b00 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
29b10 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
29b20 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
29b30 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
29b40 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73  code that stores
29b50 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
29b60 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a   those memory.**
29b70 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
29b80 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
29b90 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
29ba0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
29bb0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
29bc0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
29bd0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
29be0 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
29bf0 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
29c00 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e  nt nReg = pAggIn
29c10 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67  fo->nFunc + pAgg
29c20 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  Info->nColumn;. 
29c30 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72   if( nReg==0 ) r
29c40 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51  eturn;.#ifdef SQ
29c50 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
29c60 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
29c70 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72  AggInfo register
29c80 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  s are within the
29c90 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64   range specified
29ca0 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f   by.  ** AggInfo
29cb0 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e  .mnReg..AggInfo.
29cc0 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72  mxReg */.  asser
29cd0 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66  t( nReg==pAggInf
29ce0 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66  o->mxReg-pAggInf
29cf0 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20  o->mnReg+1 );.  
29d00 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
29d10 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
29d20 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
29d30 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
29d40 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
29d50 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
29d60 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   && pAggInfo->aC
29d70 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  ol[i].iMem<=pAgg
29d80 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
29d90 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
29da0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
29db0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
29dc0 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  t( pAggInfo->aFu
29dd0 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  nc[i].iMem>=pAgg
29de0 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
29df0 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
29e00 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c  ->aFunc[i].iMem<
29e10 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
29e20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
29e30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29e40 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
29e50 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  , pAggInfo->mnRe
29e60 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g, pAggInfo->mxR
29e70 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63  eg);.  for(pFunc
29e80 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
29e90 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
29ea0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
29eb0 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Func++){.    if(
29ec0 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
29ed0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
29ee0 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
29ef0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
29f00 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
29f10 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
29f20 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
29f30 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
29f40 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
29f50 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
29f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29f70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
29f80 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
29f90 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
29fa0 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
29fb0 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
29fc0 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
29fd0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
29fe0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
29ff0 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
2a000 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
2a010 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2a020 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
2a030 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
2a040 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a050 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2a060 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
2a070 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
2a080 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2a0a0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2a0b0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2a0c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2a0d0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
2a0e0 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
2a0f0 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
2a100 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
2a110 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
2a120 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
2a130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a140 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
2a150 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
2a160 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
2a170 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
2a180 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2a190 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
2a1a0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2a1b0 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
2a1c0 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
2a1d0 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
2a1e0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2a1f0 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
2a200 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
2a210 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
2a220 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2a230 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
2a240 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
2a250 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c  lect) );.    sql
2a260 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a270 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
2a280 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
2a290 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
2a2a0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
2a2b0 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
2a2c0 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
2a2d0 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
2a2e0 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
2a2f0 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
2a300 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
2a310 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
2a320 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
2a330 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2a340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a350 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
2a360 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
2a370 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
2a380 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
2a390 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2a3a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2a3b0 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e  regHit = 0;.  in
2a3c0 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20  t addrHitTest = 
2a3d0 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  0;.  struct AggI
2a3e0 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
2a3f0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
2a400 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
2a410 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
2a420 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
2a430 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
2a440 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
2a450 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
2a460 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
2a470 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
2a480 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
2a490 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
2a4a0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
2a4b0 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
2a4c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2a4d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
2a4e0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
2a4f0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
2a500 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
2a510 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
2a520 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
2a530 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
2a540 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2a550 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
2a560 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
2a570 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
2a580 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20  ist, regAgg, 0, 
2a590 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
2a5a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a5b0 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
2a5c0 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
2a5d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
2a5e0 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2a5f0 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
2a600 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2a610 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2a620 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d   testcase( nArg=
2a630 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20  =0 );  /* Error 
2a640 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20  condition */.   
2a650 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72     testcase( nAr
2a660 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f  g>1 );   /* Also
2a670 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
2a680 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
2a690 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
2a6a0 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
2a6b0 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
2a6c0 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
2a6d0 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
2a6e0 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
2a6f0 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
2a700 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
2a710 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
2a720 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2a730 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
2a740 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
2a750 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
2a760 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
2a770 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
2a780 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
2a790 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
2a7a0 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
2a7b0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
2a7c0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2a7d0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2a7e0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
2a7f0 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
2a800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a810 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
2a820 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
2a830 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
2a840 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
2a850 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30     if( regHit==0
2a860 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
2a870 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67  ccumulator ) reg
2a880 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Hit = ++pParse->
2a890 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
2a8a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2a8b0 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67   OP_CollSeq, reg
2a8c0 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Hit, 0, 0, (char
2a8d0 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
2a8e0 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
2a8f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a900 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p3(v, OP_AggStep
2a910 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  0, 0, regAgg, pF
2a920 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c  ->iMem);.    sql
2a930 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
2a940 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50  (v, pF->pFunc, P
2a950 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
2a960 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2a970 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
2a980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2a990 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
2a9a0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
2a9b0 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
2a9c0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2a9d0 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2a9e0 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
2a9f0 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
2aa00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2aa10 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2aa20 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
2aa30 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2aa40 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2aa50 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
2aa60 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c   /* Before popul
2aa70 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  ating the accumu
2aa80 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c  lator registers,
2aa90 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   clear the colum
2aaa0 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74  n cache..  ** Ot
2aab0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20  herwise, if any 
2aac0 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  of the required 
2aad0 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72  column values ar
2aae0 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  e already presen
2aaf0 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73  t .  ** in regis
2ab00 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70  ters, sqlite3Exp
2ab10 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20  rCode() may use 
2ab20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79  OP_SCopy to copy
2ab30 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20   the value.  ** 
2ab40 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74  to pC->iMem. But
2ab50 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
2ab60 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20   value is used, 
2ab70 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67  the original reg
2ab80 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68  ister.  ** may h
2ab90 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69  ave been used, i
2aba0 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
2abb0 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65  underlying buffe
2abc0 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  r holding the.  
2abd0 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20  ** text or blob 
2abe0 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65  value. See ticke
2abf0 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a  t [883034dcb5]..
2ac00 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65    **.  ** Anothe
2ac10 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64  r solution would
2ac20 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68   be to change th
2ac30 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20  e OP_SCopy used 
2ac40 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20  to copy cached. 
2ac50 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e   ** values to an
2ac60 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20   OP_Copy..  */. 
2ac70 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20   if( regHit ){. 
2ac80 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d     addrHitTest =
2ac90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2aca0 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
2acb0 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Hit); VdbeCovera
2acc0 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
2acd0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2ace0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
2acf0 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
2ad00 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
2ad10 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2ad20 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
2ad30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2ad40 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
2ad50 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
2ad60 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
2ad70 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
2ad80 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2ad90 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2ada0 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
2adb0 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
2adc0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2add0 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
2ade0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
2adf0 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
2ae00 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
2ae10 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
2ae20 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
2ae30 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
2ae40 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
2ae50 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
2ae60 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
2ae70 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2ae80 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
2ae90 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2aea0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2aeb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2aec0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
2aed0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
2aee0 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
2aef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
2af00 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
2af10 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
2af20 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
2af30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
2af40 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
2af50 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
2af60 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
2af70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
2af80 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d      int bCover =
2af90 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61   (pIdx!=0 && (Ha
2afa0 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
2afb0 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
2afc0 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20  ex(pIdx)));.    
2afd0 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
2afe0 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
2aff0 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
2b000 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
2b010 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
2b020 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
2b030 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52   ? " USING COVER
2b040 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
2b050 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
2b060 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a   ? pIdx->zName :
2b070 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73   "".    );.    s
2b080 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2b090 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
2b0a0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c  ->pVdbe, OP_Expl
2b0b0 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
2b0c0 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45  lectId, 0, 0, zE
2b0d0 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20  qp, P4_DYNAMIC. 
2b0e0 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
2b0f0 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
2b100 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
2b110 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
2b120 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  ** Context objec
2b130 74 20 66 6f 72 20 68 61 76 69 6e 67 54 6f 57 68  t for havingToWh
2b140 65 72 65 45 78 70 72 43 62 28 29 2e 0a 2a 2f 0a  ereExprCb()..*/.
2b150 73 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57  struct HavingToW
2b160 68 65 72 65 43 74 78 20 7b 0a 20 20 45 78 70 72  hereCtx {.  Expr
2b170 20 2a 2a 70 70 57 68 65 72 65 3b 0a 20 20 45 78   **ppWhere;.  Ex
2b180 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
2b190 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  ;.};../*.** sqli
2b1a0 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61  te3WalkExpr() ca
2b1b0 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68  llback used by h
2b1c0 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a  avingToWhere()..
2b1d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64  **.** If the nod
2b1e0 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
2b1f0 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b  callback is a TK
2b200 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72  _AND node, retur
2b210 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e  n .** WRC_Contin
2b220 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74  ue to tell sqlit
2b230 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20  e3WalkExpr() to 
2b240 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2b250 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a  child nodes..**.
2b260 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
2b270 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20  turn WRC_Prune. 
2b280 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c  In this case, al
2b290 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  so check if the 
2b2a0 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69  .** sub-expressi
2b2b0 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  on matches the c
2b2c0 72 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e  riteria for bein
2b2d0 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57  g moved to the W
2b2e0 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  HERE.** clause. 
2b2f0 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f  If so, add it to
2b300 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2b310 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68  e and replace th
2b320 65 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  e sub-expression
2b330 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48  .** within the H
2b340 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2b350 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74   with a constant
2b360 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   "1"..*/.static 
2b370 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72  int havingToWher
2b380 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
2b390 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2b3a0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2b3b0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29  pr->op!=TK_AND )
2b3c0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 48 61 76  {.    struct Hav
2b3d0 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20 2a 70  ingToWhereCtx *p
2b3e0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 48   = pWalker->u.pH
2b3f0 61 76 69 6e 67 43 74 78 3b 0a 20 20 20 20 69 66  avingCtx;.    if
2b400 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
2b410 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
2b420 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  (pWalker->pParse
2b430 2c 20 70 45 78 70 72 2c 20 70 2d 3e 70 47 72 6f  , pExpr, p->pGro
2b440 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73  upBy) ){.      s
2b450 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61  qlite3 *db = pWa
2b460 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62  lker->pParse->db
2b470 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  ;.      Expr *pN
2b480 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2b490 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
2b4a0 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
2b4b0 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a  tTokens[1], 0);.
2b4c0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
2b4d0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
2b4e0 70 57 68 65 72 65 20 3d 20 2a 28 70 2d 3e 70 70  pWhere = *(p->pp
2b4f0 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
2b500 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65 77  SWAP(Expr, *pNew
2b510 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20 20  , *pExpr);.     
2b520 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
2b530 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68  3ExprAnd(db, pWh
2b540 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
2b550 20 20 20 20 2a 28 70 2d 3e 70 70 57 68 65 72 65      *(p->ppWhere
2b560 29 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ) = pNew;.      
2b570 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
2b580 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2b590 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2b5a0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2b5b0 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69  * Transfer eligi
2b5c0 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  ble terms from t
2b5d0 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2b5e0 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77 68 69   of a query, whi
2b5f0 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73  ch is.** process
2b600 65 64 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e  ed after groupin
2b610 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  g, to the WHERE 
2b620 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20 69 73  clause, which is
2b630 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72   processed befor
2b640 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46  e.** grouping. F
2b650 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
2b660 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  query:.**.**   S
2b670 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61  ELECT * FROM <ta
2b680 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20  bles> WHERE a=? 
2b690 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e  GROUP BY b HAVIN
2b6a0 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a  G b=? AND c=?.**
2b6b0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69  .** can be rewri
2b6c0 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
2b6d0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c   SELECT * FROM <
2b6e0 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d  tables> WHERE a=
2b6f0 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20  ? AND b=? GROUP 
2b700 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a  BY b HAVING c=?.
2b710 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20  **.** A term of 
2b720 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65  the HAVING expre
2b730 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c  ssion is eligibl
2b740 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69  e for transfer i
2b750 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  f it consists.**
2b760 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e   entirely of con
2b770 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65  stants and expre
2b780 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
2b790 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65  also GROUP BY te
2b7a0 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20  rms that.** use 
2b7b0 74 68 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c  the "BINARY" col
2b7c0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
2b7d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2b7e0 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 0a 20  havingToWhere(. 
2b7f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
2b800 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
2b810 75 70 42 79 2c 0a 20 20 45 78 70 72 20 2a 70 48  upBy,.  Expr *pH
2b820 61 76 69 6e 67 2c 20 0a 20 20 45 78 70 72 20 2a  aving, .  Expr *
2b830 2a 70 70 57 68 65 72 65 0a 29 7b 0a 20 20 73 74  *ppWhere.){.  st
2b840 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68 65  ruct HavingToWhe
2b850 72 65 43 74 78 20 73 43 74 78 3b 0a 20 20 57 61  reCtx sCtx;.  Wa
2b860 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 0a 20  lker sWalker;.. 
2b870 20 73 43 74 78 2e 70 70 57 68 65 72 65 20 3d 20   sCtx.ppWhere = 
2b880 70 70 57 68 65 72 65 3b 0a 20 20 73 43 74 78 2e  ppWhere;.  sCtx.
2b890 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
2b8a0 70 42 79 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  pBy;..  memset(&
2b8b0 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65  sWalker, 0, size
2b8c0 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20  of(sWalker));.  
2b8d0 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d  sWalker.pParse =
2b8e0 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b   pParse;.  sWalk
2b8f0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
2b900 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65   = havingToWhere
2b910 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65  ExprCb;.  sWalke
2b920 72 2e 75 2e 70 48 61 76 69 6e 67 43 74 78 20 3d  r.u.pHavingCtx =
2b930 20 26 73 43 74 78 3b 0a 20 20 73 71 6c 69 74 65   &sCtx;.  sqlite
2b940 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b  3WalkExpr(&sWalk
2b950 65 72 2c 20 70 48 61 76 69 6e 67 29 3b 0a 7d 0a  er, pHaving);.}.
2b960 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
2b970 73 65 65 20 69 66 20 74 68 65 20 70 54 68 69 73  see if the pThis
2b980 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69   entry of pTabLi
2b990 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69  st is a self-joi
2b9a0 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65  n of a prior vie
2b9b0 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  w..** If it is, 
2b9c0 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
2b9d0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72  SrcList_item for
2b9e0 20 74 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e   the prior view.
2b9f0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a    If it is not,.
2ba00 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  ** then return 0
2ba10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2ba20 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2ba30 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28  *isSelfJoinView(
2ba40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2ba50 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
2ba60 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73 65  /* Search for se
2ba70 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73  lf-joins in this
2ba80 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2ba90 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2baa0 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f  _item *pThis   /
2bab0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 72 69  * Search for pri
2bac0 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  or reference to 
2bad0 74 68 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f  this subquery */
2bae0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
2baf0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2bb00 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20  ;.  for(pItem = 
2bb10 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
2bb20 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b  em<pThis; pItem+
2bb30 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
2bb40 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  m->pSelect==0 ) 
2bb50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2bb60 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  ( pItem->fg.viaC
2bb70 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69  oroutine ) conti
2bb80 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
2bb90 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63  em->zName==0 ) c
2bba0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2bbb0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2bbc0 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
2bbd0 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61 62  e, pThis->zDatab
2bbe0 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ase)!=0 ) contin
2bbf0 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2bc00 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
2bc10 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d  m->zName, pThis-
2bc20 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e  >zName)!=0 ) con
2bc30 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
2bc40 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2bc50 65 28 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74  e(pThis->pSelect
2bc60 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
2bc70 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
2bc80 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 2f  , -1) ){.      /
2bc90 2a 20 54 68 65 20 76 69 65 77 20 77 61 73 20 6d  * The view was m
2bca0 6f 64 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20  odified by some 
2bcb0 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
2bcc0 6f 6e 20 73 75 63 68 20 61 73 0a 20 20 20 20 20  on such as.     
2bcd0 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72   ** pushDownWher
2bce0 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20  eTerms() */.    
2bcf0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2bd00 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74  }.    return pIt
2bd10 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  em;.  }.  return
2bd20 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
2bd30 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
2bd40 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
2bd50 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ent given in the
2bd60 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a   p argument.  .*
2bd70 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
2bd80 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 61 63   are returned ac
2bd90 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53  cording to the S
2bda0 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
2bdb0 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ure..** See comm
2bdc0 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e  ents in sqliteIn
2bdd0 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65 72 20  t.h for further 
2bde0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a  information..**.
2bdf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2be00 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
2be10 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  er of errors.  I
2be20 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
2be30 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c  .** encountered,
2be40 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72   then an appropr
2be50 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
2be60 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a  ge is left in.**
2be70 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
2be80 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2be90 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72  tine does NOT fr
2bea0 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73 74  ee the Select st
2beb0 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20 69  ructure passed i
2bec0 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  n.  The.** calli
2bed0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64  ng function need
2bee0 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f  s to do that..*/
2bef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
2bf00 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
2bf10 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2bf20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2bf30 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
2bf40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2bf50 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
2bf60 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
2bf70 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ed. */.  SelectD
2bf80 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 20  est *pDest      
2bf90 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
2bfa0 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65 73  th the query res
2bfb0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
2bfc0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
2bfd0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2bfe0 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49  ters */.  WhereI
2bff0 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
2c000 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20   /* Return from 
2c010 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2c020 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  n() */.  Vdbe *v
2c030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c040 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d  /* The virtual m
2c050 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e  achine under con
2c060 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  struction */.  i
2c070 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20 20  nt isAgg;       
2c080 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2c090 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c  r select lists l
2c0a0 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a  ike "count(*)" *
2c0b0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
2c0c0 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69  List = 0;  /* Li
2c0d0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
2c0e0 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53   extract. */.  S
2c0f0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
2c100 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ;     /* List of
2c110 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63   tables to selec
2c120 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72  t from */.  Expr
2c130 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
2c140 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
2c150 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2c160 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69  NULL */.  ExprLi
2c170 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
2c180 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
2c190 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
2c1a0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20   NULL */.  Expr 
2c1b0 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20  *pHaving;       
2c1c0 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20    /* The HAVING 
2c1d0 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
2c1e0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63  NULL */.  int rc
2c1f0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
2c200 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
2c210 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75  urn from this fu
2c220 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74  nction */.  Dist
2c230 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63  inctCtx sDistinc
2c240 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f  t; /* Info on ho
2c250 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49  w to code the DI
2c260 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a  STINCT keyword *
2c270 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72  /.  SortCtx sSor
2c280 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t;         /* In
2c290 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
2c2a0 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
2c2b0 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e  lause */.  AggIn
2c2c0 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
2c2d0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
2c2e0 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
2c2f0 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
2c300 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
2c310 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
2c320 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
2c330 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
2c340 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
2c350 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2c360 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2c370 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2c380 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2c390 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53  .  int iRestoreS
2c3a0 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
2c3b0 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70  ->iSelectId;.  p
2c3c0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2c3d0 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74   = pParse->iNext
2c3e0 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64  SelectId++;.#end
2c3f0 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  if..  db = pPars
2c400 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
2c410 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
2c420 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
2c430 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
2c440 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
2c450 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
2c460 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
2c470 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
2c480 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
2c490 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
2c4a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
2c4b0 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45  Info));.#if SELE
2c4c0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2c4d0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
2c4e0 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c  tIndent++;.  SEL
2c4f0 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
2c500 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f  e,p, ("begin pro
2c510 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  cessing:\n"));. 
2c520 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2c530 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2c540 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  ){.    sqlite3Tr
2c550 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2c560 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2c570 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
2c580 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2c590 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2c5a0 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61  _DistFifo );.  a
2c5b0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
2c5c0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
2c5d0 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20  eDest!=SRT_Fifo 
2c5e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2c5f0 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
2c600 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54  Dest->eDest!=SRT
2c610 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20  _DistQueue );.  
2c620 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
2c630 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
2c640 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75  >eDest!=SRT_Queu
2c650 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72  e );.  if( Ignor
2c660 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2c670 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
2c680 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
2c690 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
2c6a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
2c6b0 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
2c6c0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2c6d0 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
2c6e0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2c6f0 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20  T_Discard ||.   
2c700 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2c710 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20  Dest==SRT_Queue 
2c720 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2c730 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c  ==SRT_DistFifo |
2c740 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65  |.           pDe
2c750 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2c760 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73  istQueue || pDes
2c770 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69  t->eDest==SRT_Fi
2c780 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  fo);.    /* If O
2c790 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
2c7a0 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
2c7b0 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
2c7c0 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
2c7d0 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
2c7e0 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
2c7f0 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
2c800 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2c810 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
2c820 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
2c830 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
2c840 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2c850 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
2c860 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2c870 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
2c880 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72  ;.  memset(&sSor
2c890 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f  t, 0, sizeof(sSo
2c8a0 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f  rt));.  sSort.pO
2c8b0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
2c8c0 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74  erBy;.  pTabList
2c8d0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66   = p->pSrc;.  if
2c8e0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2c8f0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2c900 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
2c910 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
2c920 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
2c930 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67  st!=0 );.  isAgg
2c940 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2c950 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
2c960 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  =0;.#if SELECTTR
2c970 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2c980 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2c990 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2c9a0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2c9b0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20  0x100,pParse,p, 
2c9c0 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  ("after name res
2c9d0 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20  olution:\n"));. 
2c9e0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2c9f0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2ca00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2ca10 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61 74 74   /* Try to flatt
2ca20 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  en subqueries in
2ca30 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2ca40 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69   up into the mai
2ca50 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66  n query.  */.#if
2ca60 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2ca70 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
2ca80 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
2ca90 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20  TE_OMIT_VIEW).  
2caa0 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72  for(i=0; !p->pPr
2cab0 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73  ior && i<pTabLis
2cac0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
2cad0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2cae0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2caf0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
2cb00 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
2cb10 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  b = pItem->pSele
2cb20 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67  ct;.    int isAg
2cb30 67 53 75 62 3b 0a 20 20 20 20 54 61 62 6c 65 20  gSub;.    Table 
2cb40 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
2cb50 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 53 75  Tab;.    if( pSu
2cb60 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2cb70 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d  ..    /* Catch m
2cb80 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64  ismatch in the d
2cb90 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20  eclared columns 
2cba0 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  of a view and th
2cbb0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
2cbc0 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ** columns in th
2cbd0 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20  e SELECT on the 
2cbe0 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  RHS */.    if( p
2cbf0 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d  Tab->nCol!=pSub-
2cc00 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
2cc10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2cc20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2cc30 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c  "expected %d col
2cc40 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75  umns for '%s' bu
2cc50 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20  t got %d",.     
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc70 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61   pTab->nCol, pTa
2cc80 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e  b->zName, pSub->
2cc90 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
2cca0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
2ccb0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  t_end;.    }..  
2ccc0 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53    isAggSub = (pS
2ccd0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
2cce0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
2ccf0 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
2cd00 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
2cd10 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73   p, i, isAgg, is
2cd20 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20  AggSub) ){.     
2cd30 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
2cd40 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
2cd50 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
2cd60 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
2cd70 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20  isAggSub ){.    
2cd80 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
2cd90 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61         p->selFla
2cda0 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
2cdb0 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
2cdc0 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    i = -1;.    }.
2cdd0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
2cde0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
2cdf0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ce00 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2ce10 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  nd;.    if( !Ign
2ce20 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2ce30 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
2ce40 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
2ce50 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
2ce60 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2ce70 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
2ce80 20 74 68 65 20 56 44 42 45 20 75 6e 64 65 72 20   the VDBE under 
2ce90 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c  construction, al
2cea0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56  locating a new V
2ceb0 44 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  DBE if one.  ** 
2cec0 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
2ced0 20 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20   exist */.  v = 
2cee0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
2cef0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
2cf00 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
2cf10 5f 65 6e 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53  _end;..#ifndef S
2cf20 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
2cf30 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
2cf40 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20  Handle compound 
2cf50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2cf60 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61  s using the sepa
2cf70 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74  rate multiSelect
2cf80 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72  ().  ** procedur
2cf90 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
2cfa0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
2cfb0 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  c = multiSelect(
2cfc0 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
2cfd0 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65  );.    explainSe
2cfe0 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
2cff0 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
2d000 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23  toreSelectId);.#
2d010 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2d020 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43  NABLED.    SELEC
2d030 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2d040 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64  p,("end compound
2d050 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69  -select processi
2d060 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61  ng\n"));.    pPa
2d070 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
2d080 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt--;.#endif.   
2d090 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2d0a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72  #endif..  /* For
2d0b0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
2d0c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64  e FROM clause, d
2d0d0 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20  o two things:.  
2d0e0 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65  ** (1) Authorize
2d0f0 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74  d unreferenced t
2d100 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47  ables.  ** (2) G
2d110 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2d120 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
2d130 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
2d140 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2d150 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2d160 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2d170 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2d180 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2d190 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
2d1a0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
2d1b0 3b 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 20  ;..    /* Issue 
2d1c0 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68  SQLITE_READ auth
2d1d0 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69 74 68 20  orizations with 
2d1e0 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  a fake column na
2d1f0 6d 65 20 66 6f 72 20 61 6e 79 20 74 61 62 6c 65  me for any table
2d200 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72  s that.    ** ar
2d210 65 20 72 65 66 65 72 65 6e 63 65 64 20 62 75 74  e referenced but
2d220 20 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76   from which no v
2d230 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61 63  alues are extrac
2d240 74 65 64 2e 20 45 78 61 6d 70 6c 65 73 20 6f 66  ted. Examples of
2d250 20 77 68 65 72 65 20 74 68 65 73 65 0a 20 20 20   where these.   
2d260 20 2a 2a 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c   ** kinds of nul
2d270 6c 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75  l SQLITE_READ au
2d280 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 6f 75  thorizations wou
2d290 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a  ld occur:.    **
2d2a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
2d2b0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2d2c0 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45   t1;   -- SQLITE
2d2d0 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20  _READ t1."".    
2d2e0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74 31  **     SELECT t1
2d2f0 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20  .* FROM t1, t2; 
2d300 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44    -- SQLITE_READ
2d310 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20   t2."".    **.  
2d320 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f    ** The fake co
2d330 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20  lumn name is an 
2d340 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49  empty string.  I
2d350 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
2d360 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20  r a table to.   
2d370 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d   ** have a colum
2d380 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65  n named by the e
2d390 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20  mpty string, in 
2d3a0 77 68 69 63 68 20 63 61 73 65 20 74 68 65 72 65  which case there
2d3b0 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20   is no way to.  
2d3c0 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68    ** distinguish
2d3d0 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65   between an unre
2d3e0 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61  ferenced table a
2d3f0 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66  nd an actual ref
2d400 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20  erence to the.  
2d410 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20    ** "" column. 
2d420 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
2d430 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65  sign was for the
2d440 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
2d450 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a  e to be a NULL,.
2d460 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2d470 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75  ld be unambiguou
2d480 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20 61  s.  But legacy a
2d490 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c  uthorization cal
2d4a0 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20  lbacks might.   
2d4b0 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63   ** assume the c
2d4c0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f  olumn name is no
2d4d0 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61  n-NULL and segfa
2d4e0 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66  ult.  The use of
2d4f0 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
2d500 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
2d510 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
2d520 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20   seems safer..  
2d530 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74    */.    if( pIt
2d540 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29  em->colUsed==0 )
2d550 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  {.      sqlite3A
2d560 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
2d570 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49   SQLITE_READ, pI
2d580 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20  tem->zName, "", 
2d590 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
2d5a0 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  );.    }..#if !d
2d5b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2d5c0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
2d5d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2d5e0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f  OMIT_VIEW).    /
2d5f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2d600 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
2d610 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
2d620 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20  clause.    */.  
2d630 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e    pSub = pItem->
2d640 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
2d650 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
2d660 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
2d670 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
2d680 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
2d690 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
2d6a0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
2d6b0 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
2d6c0 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
2d6d0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2d6e0 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
2d6f0 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
2d700 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
2d710 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
2d720 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
2d730 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
2d740 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
2d750 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
2d760 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
2d770 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
2d780 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
2d790 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
2d7a0 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
2d7b0 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
2d7c0 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
2d7d0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
2d7e0 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
2d7f0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2d800 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
2d810 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2d820 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d  fg.viaCoroutine=
2d830 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
2d840 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   The subroutine 
2d850 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20 74  that manifests t
2d860 68 65 20 76 69 65 77 20 6d 69 67 68 74 20 62 65  he view might be
2d870 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74   a one-time rout
2d880 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ine,.        ** 
2d890 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65 64  or it might need
2d8a0 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e 20   to be rerun on 
2d8b0 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62  each iteration b
2d8c0 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20  ecause it.      
2d8d0 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20 63    ** encodes a c
2d8e0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
2d8f0 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  ry. */.        t
2d900 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
2d910 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49 74  VdbeGetOp(v, pIt
2d920 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
2d930 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63  ->opcode==OP_Onc
2d940 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
2d950 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2d960 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65  , OP_Gosub, pIte
2d970 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49  m->regReturn, pI
2d980 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2d990 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2d9a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2d9b0 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
2d9c0 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
2d9d0 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
2d9e0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
2d9f0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
2da00 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f  tree referred to
2da10 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
2da20 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
2da30 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
2da40 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
2da50 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
2da60 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
2da70 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
2da80 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
2da90 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
2daa0 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
2dab0 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
2dac0 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
2dad0 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
2dae0 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
2daf0 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
2db00 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
2db10 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
2db20 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
2db30 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
2db40 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
2db50 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
2db60 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63  constant WHERE-c
2db70 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74  lause terms in t
2db80 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
2db90 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64  own.    ** insid
2dba0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  e the subquery. 
2dbb0 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74   This can help t
2dbc0 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72  he subquery to r
2dbd0 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  un more efficien
2dbe0 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tly..    */.    
2dbf0 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  if( (pItem->fg.j
2dc00 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
2dc10 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  ER)==0.     && p
2dc20 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d  ushDownWhereTerm
2dc30 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  s(pParse, pSub, 
2dc40 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
2dc50 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 29  ->iCursor).    )
2dc60 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  {.#if SELECTTRAC
2dc70 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20  E_ENABLED.      
2dc80 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2dc90 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2dca0 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
2dcb0 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
2dcc0 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45  se,p,("After WHE
2dcd0 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64  RE-clause push-d
2dce0 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20  own:\n"));.     
2dcf0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
2dd00 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
2dd10 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2dd20 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
2dd30 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
2dd40 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
2dd50 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20  ubquery.    **. 
2dd60 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65     ** The subque
2dd70 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ry is implemente
2dd80 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
2dd90 65 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  e if all of thes
2dda0 65 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  e are true:.    
2ddb0 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
2ddc0 62 71 75 65 72 79 20 69 73 20 67 75 61 72 61 6e  bquery is guaran
2ddd0 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f  teed to be the o
2dde0 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68  uter loop (so th
2ddf0 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 20 20 20  at it.    **    
2de00 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65      does not nee
2de10 64 20 74 6f 20 62 65 20 63 6f 6d 70 75 74 65 64  d to be computed
2de20 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29   more than once)
2de30 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 54  .    **   (2)  T
2de40 68 65 20 41 4c 4c 20 6b 65 79 77 6f 72 64 20 61  he ALL keyword a
2de50 66 74 65 72 20 53 45 4c 45 43 54 20 69 73 20 6f  fter SELECT is o
2de60 6d 69 74 74 65 64 2e 20 20 28 41 70 70 6c 69 63  mitted.  (Applic
2de70 61 74 69 6f 6e 73 20 61 72 65 0a 20 20 20 20 2a  ations are.    *
2de80 2a 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64  *        allowed
2de90 20 74 6f 20 73 61 79 20 22 53 45 4c 45 43 54 20   to say "SELECT 
2dea0 41 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20  ALL" instead of 
2deb0 6a 75 73 74 20 22 53 45 4c 45 43 54 22 20 74 6f  just "SELECT" to
2dec0 20 64 69 73 61 62 6c 65 0a 20 20 20 20 2a 2a 20   disable.    ** 
2ded0 20 20 20 20 20 20 20 74 68 65 20 75 73 65 20 6f         the use o
2dee0 66 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 29 0a  f co-routines.).
2def0 20 20 20 20 2a 2a 20 20 20 28 33 29 20 20 43 6f      **   (3)  Co
2df00 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 6e 6f  -routines are no
2df10 74 20 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67  t disabled using
2df20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2df30 6e 74 72 6f 6c 28 29 0a 20 20 20 20 2a 2a 20 20  ntrol().    **  
2df40 20 20 20 20 20 20 77 69 74 68 20 53 51 4c 49 54        with SQLIT
2df50 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
2df60 49 5a 41 54 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a  IZATIONS..    **
2df70 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72  .    ** TODO: Ar
2df80 65 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65  e there other re
2df90 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29  asons beside (1)
2dfa0 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75   to use a co-rou
2dfb0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c  tine.    ** impl
2dfc0 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20  ementation?.    
2dfd0 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a  */.    if( i==0.
2dfe0 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
2dff0 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
2e000 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c         || (pTabL
2e010 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69  ist->a[1].fg.joi
2e020 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a  ntype&(JT_LEFT|J
2e030 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f  T_CROSS))!=0)  /
2e040 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 26 26  * (1) */.     &&
2e050 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2e060 53 46 5f 41 6c 6c 29 3d 3d 30 20 20 20 20 20 20  SF_All)==0      
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e090 28 32 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 4f  (2) */.     && O
2e0a0 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
2e0b0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75  ed(db, SQLITE_Su
2e0c0 62 71 43 6f 72 6f 75 74 69 6e 65 29 20 20 20 20  bqCoroutine)    
2e0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33             /* (3
2e0e0 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
2e0f0 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
2e100 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
2e110 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
2e120 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
2e130 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
2e140 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
2e150 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
2e160 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2e170 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
2e180 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
2e190 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
2e1a0 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
2e1b0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2e1c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2e1d0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
2e1e0 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
2e1f0 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61 64  regReturn, 0, ad
2e200 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56 64  drTop);.      Vd
2e210 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2e220 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
2e230 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2e240 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
2e250 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20  ub = addrTop;.  
2e260 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2e270 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
2e280 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
2e290 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
2e2a0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
2e2b0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2e2c0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2e2d0 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2e2e0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73  lectId);.      s
2e2f0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
2e300 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
2e310 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
2e320 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
2e330 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74   = pSub->nSelect
2e340 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  Row;.      pItem
2e350 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
2e360 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74  e = 1;.      pIt
2e370 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20  em->regResult = 
2e380 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20  dest.iSdst;.    
2e390 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
2e3a0 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74  Coroutine(v, pIt
2e3b0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
2e3c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2e3d0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2e3e0 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73  rTop-1);.      s
2e3f0 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
2e400 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
2e410 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e420 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
2e430 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2e440 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68  will fill an eph
2e450 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74  emeral table wit
2e460 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  h.      ** the c
2e470 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73  ontent of this s
2e480 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d  ubquery.  pItem-
2e490 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c  >addrFillSub wil
2e4a0 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  l point.      **
2e4b0 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73 20   to the address 
2e4c0 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2e4d0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49   subroutine.  pI
2e4e0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20  tem->regReturn. 
2e4f0 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67       ** is a reg
2e500 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ister allocated 
2e510 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72  to hold the subr
2e520 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64  outine return ad
2e530 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20  dress.      */. 
2e540 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72       int topAddr
2e550 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65  ;.      int once
2e560 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Addr = 0;.      
2e570 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20  int retAddr;.   
2e580 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2e590 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a  t_item *pPrior;.
2e5a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2e5b0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2e5c0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49  b==0 );.      pI
2e5d0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
2e5e0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2e5f0 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d  .      topAddr =
2e600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e610 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2e620 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  , 0, pItem->regR
2e630 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49  eturn);.      pI
2e640 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2e650 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20   = topAddr+1;.  
2e660 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
2e670 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d  g.isCorrelated==
2e680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2e690 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
2e6a0 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65  is not correlate
2e6b0 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20  d and if we are 
2e6c0 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20  not inside of.  
2e6d0 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67        ** a trigg
2e6e0 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79  er, then we only
2e6f0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
2e700 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2e710 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20  e subquery.     
2e720 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20     ** once. */. 
2e730 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20         onceAddr 
2e740 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2e750 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
2e760 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2e770 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2e780 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
2e790 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20  ialize \"%s\"", 
2e7a0 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2e7b0 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  me));.      }els
2e7c0 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e  e{.        VdbeN
2e7d0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
2e7e0 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
2e7f0 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
2e800 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2e810 20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20   }.      pPrior 
2e820 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77  = isSelfJoinView
2e830 28 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d  (pTabList, pItem
2e840 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  );.      if( pPr
2e850 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ior ){.        s
2e860 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2e870 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20  (v, OP_OpenDup, 
2e880 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20  pItem->iCursor, 
2e890 70 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29  pPrior->iCursor)
2e8a0 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
2e8b0 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
2e8c0 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 70 50  m->iSelectId, pP
2e8d0 72 69 6f 72 2d 3e 69 53 65 6c 65 63 74 49 64 29  rior->iSelectId)
2e8e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2e8f0 28 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63  ( pPrior->pSelec
2e900 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
2e910 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2e920 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65   = pPrior->pSele
2e930 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ct->nSelectRow;.
2e940 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e950 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2e960 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
2e970 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20  , SRT_EphemTab, 
2e980 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
2e990 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
2e9a0 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d  SetInteger(pItem
2e9b0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38  ->iSelectId, (u8
2e9c0 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65  )pParse->iNextSe
2e9d0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20  lectId);.       
2e9e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
2e9f0 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
2ea00 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2ea10 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
2ea20 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
2ea30 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
2ea40 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
2ea50 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
2ea60 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
2ea70 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
2ea80 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2ea90 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2eaa0 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
2eab0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
2eac0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2ead0 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
2eae0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2eaf0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2eb00 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
2eb10 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
2eb20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
2eb30 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
2eb40 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
2eb50 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2eb60 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2eb70 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61  ect_end;.    pPa
2eb80 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
2eb90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
2eba0 72 48 65 69 67 68 74 28 70 29 3b 0a 23 65 6e 64  rHeight(p);.#end
2ebb0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61 72  if.  }..  /* Var
2ebc0 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66  ious elements of
2ebd0 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69   the SELECT copi
2ebe0 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61  ed into local va
2ebf0 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a  riables for.  **
2ec00 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a   convenience */.
2ec10 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
2ec20 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d  List;.  pWhere =
2ec30 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47   p->pWhere;.  pG
2ec40 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
2ec50 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20  upBy;.  pHaving 
2ec60 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20  = p->pHaving;.  
2ec70 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
2ec80 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   = (p->selFlags 
2ec90 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
2eca0 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52  0;..#if SELECTTR
2ecb0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66  ACE_ENABLED.  if
2ecc0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2ecd0 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
2ece0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2ecf0 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
2ed00 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d  "After all FROM-
2ed10 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a  clause analysis:
2ed20 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
2ed30 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2ed40 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2ed50 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
2ed60 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
2ed70 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
2ed80 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
2ed90 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
2eda0 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
2edb0 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
2edc0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
2edd0 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
2ede0 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
2edf0 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
2ee00 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
2ee10 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
2ee20 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
2ee30 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
2ee40 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
2ee50 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
2ee60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
2ee70 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
2ee80 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2ee90 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
2eea0 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44  GROUP BY xyz ORD
2eeb0 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20  ER BY xyz.  **. 
2eec0 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66   ** The second f
2eed0 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64  orm is preferred
2eee0 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64   as a single ind
2eef0 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c  ex (or temp-tabl
2ef00 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20  e) may be .  ** 
2ef10 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68  used for both th
2ef20 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44  e ORDER BY and D
2ef30 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69  ISTINCT processi
2ef40 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c  ng. As originall
2ef50 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  y .  ** written 
2ef60 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75  the query must u
2ef70 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20  se a temp-table 
2ef80 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  for at least one
2ef90 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20   of the ORDER . 
2efa0 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49   ** BY and DISTI
2efb0 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65  NCT, and an inde
2efc0 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65  x or separate te
2efd0 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65  mp-table for the
2efe0 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   other..  */.  i
2eff0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
2f000 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
2f010 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
2f020 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26  F_Distinct .   &
2f030 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  & sqlite3ExprLis
2f040 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70  tCompare(sSort.p
2f050 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c  OrderBy, pEList,
2f060 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
2f070 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2f080 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
2f090 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
2f0a0 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
2f0b0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
2f0c0 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20  , pEList, 0);.  
2f0d0 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
2f0e0 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
2f0f0 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
2f100 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
2f110 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
2f120 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
2f130 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
2f140 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
2f150 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
2f160 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
2f170 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
2f180 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
2f190 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
2f1a0 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
2f1b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
2f1c0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
2f1d0 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
2f1e0 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
2f1f0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2f200 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
2f210 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
2f220 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
2f230 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53  ,("Transform DIS
2f240 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50  TINCT into GROUP
2f250 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20   BY:\n"));.     
2f260 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2f270 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2f280 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2f290 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
2f2a0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
2f2b0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65  clause, then cre
2f2c0 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ate an ephemeral
2f2d0 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64   index to.  ** d
2f2e0 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20  o the sorting.  
2f2f0 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67  But this sorting
2f300 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
2f310 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20   might end up.  
2f320 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  ** being unused 
2f330 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
2f340 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20  be extracted in 
2f350 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72  pre-sorted order
2f360 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69  ..  ** If that i
2f370 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
2f380 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
2f390 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f  meral instructio
2f3a0 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63  n will be.  ** c
2f3b0 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f  hanged to an OP_
2f3c0 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67  Noop once we fig
2f3d0 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65  ure out that the
2f3e0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
2f3f0 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65  s.  ** not neede
2f400 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64  d.  The sSort.ad
2f410 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69  drSortIndex vari
2f420 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
2f430 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20  facilitate.  ** 
2f440 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
2f450 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
2f460 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
2f470 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
2f480 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
2f490 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2f4a0 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72  ist(pParse, sSor
2f4b0 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70  t.pOrderBy, 0, p
2f4c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
2f4d0 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f     sSort.iECurso
2f4e0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2f4f0 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  ++;.    sSort.ad
2f500 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
2f510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f520 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2f530 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
2f540 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72       sSort.iECur
2f550 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sor, sSort.pOrde
2f560 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c  rBy->nExpr+1+pEL
2f570 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20  ist->nExpr, 0,. 
2f580 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2f590 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2f5a0 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20  INFO.      );.  
2f5b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74  }else{.    sSort
2f5c0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d  .addrSortIndex =
2f5d0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
2f5e0 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
2f5f0 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
2f600 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
2f610 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
2f620 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
2f630 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
2f640 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
2f650 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2f660 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
2f670 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
2f680 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
2f690 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
2f6a0 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
2f6b0 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
2f6c0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
2f6d0 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70 2d  el(v);.  if( (p-
2f6e0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46  >selFlags & SF_F
2f6f0 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b  ixedLimit)==0 ){
2f700 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
2f710 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20  ow = 320;  /* 4 
2f720 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a  billion rows */.
2f730 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d    }.  computeLim
2f740 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
2f750 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20  se, p, iEnd);.  
2f760 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30  if( p->iLimit==0
2f770 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f   && sSort.addrSo
2f780 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20  rtIndex>=0 ){.  
2f790 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2f7a0 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f  ngeOpcode(v, sSo
2f7b0 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2f7c0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29  , OP_SorterOpen)
2f7d0 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74  ;.    sSort.sort
2f7e0 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41  Flags |= SORTFLA
2f7f0 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  G_UseSorter;.  }
2f800 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65  ..  /* Open an e
2f810 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
2f820 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69  o use for the di
2f830 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f  stinct set..  */
2f840 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
2f850 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2f860 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63   ){.    sDistinc
2f870 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72  t.tabTnct = pPar
2f880 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2f890 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e  sDistinct.addrTn
2f8a0 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ct = sqlite3Vdbe
2f8b0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2f8c0 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
2f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8e0 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
2f8f0 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
2f900 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2f920 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f  char*)keyInfoFro
2f930 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
2f940 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29  , p->pEList,0,0)
2f950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
2f970 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2f980 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2f990 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
2f9a0 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69  RDERED);.    sDi
2f9b0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
2f9c0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2f9d0 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d  T_UNORDERED;.  }
2f9e0 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69  else{.    sDisti
2f9f0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
2fa00 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
2fa10 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
2fa20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
2fa30 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
2fa40 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  No aggregate fun
2fa50 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52  ctions and no GR
2fa60 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
2fa70 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c  .    u16 wctrlFl
2fa80 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74  ags = (sDistinct
2fa90 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f  .isTnct ? WHERE_
2faa0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20  WANT_DISTINCT : 
2fab0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
2fac0 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d  WHERE_USE_LIMIT=
2fad0 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29  =SF_FixedLimit )
2fae0 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73  ;.    wctrlFlags
2faf0 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20   |= p->selFlags 
2fb00 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b  & SF_FixedLimit;
2fb10 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74  ..    /* Begin t
2fb20 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
2fb30 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20  . */.    pWInfo 
2fb40 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2fb50 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2fb60 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53  List, pWhere, sS
2fb70 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20  ort.pOrderBy,.  
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
2fba0 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61  pEList, wctrlFla
2fbb0 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  gs, p->nSelectRo
2fbc0 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  w);.    if( pWIn
2fbd0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2fbe0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2fbf0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
2fc00 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
2fc10 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74  fo) < p->nSelect
2fc20 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Row ){.      p->
2fc30 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
2fc40 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52  ite3WhereOutputR
2fc50 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b  owCount(pWInfo);
2fc60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2fc70 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2fc80 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
2fc90 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
2fca0 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74  ) ){.      sDist
2fcb0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
2fcc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
2fcd0 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b  istinct(pWInfo);
2fce0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2fcf0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
2fd00 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42  .      sSort.nOB
2fd10 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Sat = sqlite3Whe
2fd20 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2fd30 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74  fo);.      sSort
2fd40 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  .bOrderedInnerLo
2fd50 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  op = sqlite3Wher
2fd60 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  eOrderedInnerLoo
2fd70 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  p(pWInfo);.     
2fd80 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61   if( sSort.nOBSa
2fd90 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  t==sSort.pOrderB
2fda0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
2fdb0 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72      sSort.pOrder
2fdc0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  By = 0;.      }.
2fdd0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
2fde0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
2fdf0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
2fe00 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
2fe10 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
2fe20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
2fe30 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
2fe40 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
2fe50 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
2fe60 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
2fe70 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
2fe80 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
2fe90 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  f( sSort.addrSor
2fea0 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f  tIndex>=0 && sSo
2feb0 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  rt.pOrderBy==0 )
2fec0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
2fed0 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
2fee0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
2fef0 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a  tIndex);.    }..
2ff00 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
2ff10 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
2ff20 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63  op. */.    selec
2ff30 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
2ff40 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31  e, p, pEList, -1
2ff50 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
2ff60 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
2ff70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff80 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
2ff90 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66  tinueLabel(pWInf
2ffa0 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
2ffb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2ffc0 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
2ffd0 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a  WInfo));..    /*
2ffe0 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
2fff0 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
30000 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
30010 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
30020 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
30030 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20   This case when 
30040 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72  there exist aggr
30050 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
30060 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
30070 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62  ause.    ** or b
30080 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  oth */.    NameC
30090 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
300a0 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
300b0 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
300c0 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
300d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
300e0 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
300f0 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
30100 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
30110 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
30120 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
30130 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
30140 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
30150 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
30160 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
30170 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
30180 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
30190 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
301a0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
301b0 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
301c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
301d0 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
301e0 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
301f0 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
30200 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
30210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
30220 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
30230 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
30240 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
30250 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
30260 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
30270 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
30280 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
30290 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
302a0 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
302b0 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20  UP BY order */. 
302c0 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
302d0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
302e0 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
302f0 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
30300 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20     int sortPTab 
30310 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f  = 0;   /* Pseudo
30320 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65  table used to de
30330 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73  code sorting res
30340 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ults */.    int 
30350 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20  sortOut = 0;    
30360 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74  /* Output regist
30370 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  er from the sort
30380 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72  er */.    int or
30390 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a  derByGrp = 0; /*
303a0 20 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f   True if the GRO
303b0 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20  UP BY and ORDER 
303c0 42 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  BY are the same 
303d0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
303e0 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
303f0 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
30400 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
30410 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
30420 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
30430 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
30440 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
30450 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
30460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
30470 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
30480 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
30490 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
304a0 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
304b0 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
304c0 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
304d0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
304e0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
304f0 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
30500 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
30510 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
30520 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
30530 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
30540 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42     for(k=pGroupB
30550 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  y->nExpr, pItem=
30560 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30  pGroupBy->a; k>0
30570 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
30580 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
30590 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
305a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
305b0 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65  sert( 66==sqlite
305c0 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a  3LogEst(100) );.
305d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
305e0 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e  lectRow>66 ) p->
305f0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b  nSelectRow = 66;
30600 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30610 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
30620 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b  ite3LogEst(1) );
30630 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
30640 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  tRow = 0;.    }.
30650 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
30660 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
30670 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
30680 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
30690 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69  hey are.    ** i
306a0 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69  dentical, then i
306b0 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c  t may be possibl
306c0 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  e to disable the
306d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
306e0 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20   .    ** on the 
306f0 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65  grounds that the
30700 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63   GROUP BY will c
30710 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f  ause elements to
30720 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a   come out .    *
30730 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
30740 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20   order. It also 
30750 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52  may not - the GR
30760 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65  OUP BY might use
30770 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61   a.    ** databa
30780 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  se index that ca
30790 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20  uses rows to be 
307a0 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
307b0 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   as required.   
307c0 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75   ** but not actu
307d0 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74  ally sorted. Eit
307e0 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20  her way, record 
307f0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
30800 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42  e.    ** ORDER B
30810 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63  Y and GROUP BY c
30820 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73  lauses are the s
30830 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74  ame by setting t
30840 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20  he orderByGrp.  
30850 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
30860 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
30870 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
30880 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72  e(pGroupBy, sSor
30890 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  t.pOrderBy, -1)=
308a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  =0 ){.      orde
308b0 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20  rByGrp = 1;.    
308c0 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  }. .    /* Creat
308d0 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
308e0 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
308f0 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
30900 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
30910 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
30920 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
30930 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
30940 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
30950 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
30960 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
30970 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
30980 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
30990 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
309a0 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
309b0 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
309c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
309d0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
309e0 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
309f0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
30a00 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
30a10 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
30a20 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
30a30 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
30a40 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
30a50 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
30a60 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
30a70 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
30a80 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
30a90 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
30aa0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20  roupBy->nExpr : 
30ab0 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
30ac0 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
30ad0 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
30ae0 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
30af0 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
30b00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
30b10 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
30b20 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64  &sNC, sSort.pOrd
30b30 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
30b40 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
30b50 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
30b60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30b70 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65 72  pWhere==p->pWher
30b80 65 20 29 3b 0a 20 20 20 20 20 20 20 20 68 61 76  e );.        hav
30b90 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61 72 73  ingToWhere(pPars
30ba0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 48 61  e, pGroupBy, pHa
30bb0 76 69 6e 67 2c 20 26 70 2d 3e 70 57 68 65 72 65  ving, &p->pWhere
30bc0 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65 72  );.        pWher
30bd0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
30be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
30bf0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
30c00 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
30c10 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
30c20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
30c30 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
30c40 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
30c50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
30c60 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
30c70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
30c80 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
30c90 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
30ca0 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
30cb0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
30cc0 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
30cd0 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20   NC_InAggFunc;. 
30ce0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
30cf0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
30d00 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
30d10 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
30d20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e  pList);.      sN
30d30 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
30d40 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
30d50 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  }.    sAggInfo.m
30d60 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xReg = pParse->n
30d70 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Mem;.    if( db-
30d80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
30d90 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
30da0 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
30db0 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
30dc0 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
30dd0 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
30de0 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
30df0 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
30e00 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
30e10 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
30e20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
30e30 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
30e40 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
30e50 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
30e60 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
30e70 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
30e80 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
30e90 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
30ea0 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
30eb0 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
30ec0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
30ed0 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
30ee0 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
30ef0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
30f00 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
30f10 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
30f20 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
30f30 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
30f40 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
30f50 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
30f60 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
30f70 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
30f80 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
30f90 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
30fa0 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
30fb0 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
30fc0 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
30fd0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
30fe0 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
30ff0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
31000 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
31010 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
31020 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
31030 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
31040 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
31050 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
31060 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
31070 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
31080 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
31090 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
310a0 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
310b0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
310c0 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
310d0 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
310e0 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
310f0 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
31100 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
31110 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
31120 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
31130 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
31140 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
31150 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
31160 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
31170 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
31180 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  en instruction. 
31190 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
311a0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
311b0 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
311c0 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
311d0 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
311e0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
311f0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
31200 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
31210 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
31220 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f  pBy, 0, sAggInfo
31230 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  .nColumn);.     
31240 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
31250 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
31260 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
31270 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
31280 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
31290 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
312a0 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
312b0 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
312c0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
312d0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
312e0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
312f0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
31300 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
31310 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
31320 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
31330 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
31340 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
31350 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
31360 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
31370 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
31380 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
31390 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
313a0 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
313b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
313c0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
313d0 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
313e0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
313f0 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
31400 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
31410 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
31420 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
31430 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
31440 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
31450 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
31460 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
31470 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
31480 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
31490 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
314a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
314b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
314c0 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
314d0 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
314e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
314f0 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
31500 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
31510 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31520 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
31530 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
31540 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
31550 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
31560 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
31570 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31580 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
31590 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
315a0 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
315b0 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
315c0 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
315d0 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
315e0 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
315f0 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
31600 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
31610 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
31620 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
31630 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
31640 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
31650 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
31660 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
31670 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
31680 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
31690 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
316a0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
316b0 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
316c0 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
316d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
316e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
316f0 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
31700 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
31710 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
31720 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
31730 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
31740 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
31750 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
31760 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
31770 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
31780 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
31790 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
317a0 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
317b0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
317c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
317d0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
317e0 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
317f0 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
31800 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
31810 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
31820 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
31830 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
31840 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
31850 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
31860 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
31870 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
31880 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
31890 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
318a0 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
318b0 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
318c0 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
318d0 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
318e0 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
318f0 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
31900 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
31910 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
31920 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
31930 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
31940 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
31950 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
31960 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
31970 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
31980 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
31990 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
319a0 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
319b0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
319c0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
319d0 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
319e0 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
319f0 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
31a00 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
31a10 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
31a20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
31a30 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
31a40 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
31a50 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
31a60 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
31a70 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
31a80 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
31a90 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
31aa0 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
31ab0 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
31ac0 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
31ad0 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
31ae0 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
31af0 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
31b00 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
31b10 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
31b20 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
31b30 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
31b40 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
31b50 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
31b60 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
31b70 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
31b80 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
31b90 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
31ba0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
31bb0 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
31bc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
31bd0 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
31be0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31bf0 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
31c00 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
31c10 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
31c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
31c30 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
31c40 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
31c50 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
31c60 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
31c70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
31c80 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
31c90 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
31ca0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
31cb0 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
31cc0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
31cd0 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
31ce0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
31cf0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
31d00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31d10 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
31d20 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
31d30 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
31d40 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
31d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
31d60 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
31d70 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20  ToReg(pParse, . 
31d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
31da0 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
31db0 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
31dc0 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20  Table, r1);.    
31dd0 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
31de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31df0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
31e00 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
31e10 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
31e20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31e30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
31e40 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
31e50 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
31e60 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
31e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31e80 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
31e90 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
31ea0 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
31eb0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
31ec0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
31ed0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
31ee0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
31ef0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
31f00 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
31f10 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
31f20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31f30 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
31f40 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
31f50 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54  nfo.sortingIdxPT
31f60 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20  ab = sortPTab = 
31f70 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
31f80 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20          sortOut 
31f90 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
31fa0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
31fb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31fc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
31fd0 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61  nPseudo, sortPTa
31fe0 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c  b, sortOut, nCol
31ff0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32000 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32010 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73  OP_SorterSort, s
32020 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
32030 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
32040 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
32050 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
32060 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76  sort")); VdbeCov
32070 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
32080 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
32090 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
320a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
320b0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
320c0 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20  se);..      }.. 
320d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
320e0 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72  ndex or temporar
320f0 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  y table used by 
32100 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72  the GROUP BY sor
32110 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  t.      ** will 
32120 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65  naturally delive
32130 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72  r rows in the or
32140 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79 20  der required by 
32150 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
32160 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61     ** clause, ca
32170 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72  ncel the ephemer
32180 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f  al table open co
32190 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20  ded earlier..   
321a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
321b0 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
321c0 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
321d0 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
321e0 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
321f0 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  less..      ** U
32200 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
32210 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
32220 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
32230 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74  CTRL_OPTIMIZER t
32240 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61  o .      ** disa
32250 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ble this optimiz
32260 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e  ation for testin
32270 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a  g purposes.  */.
32280 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72 42        if( orderB
32290 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  yGrp && Optimiza
322a0 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
322b0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
322c0 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  der) .       && 
322d0 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20  (groupBySort || 
322e0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f  sqlite3WhereIsSo
322f0 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20  rted(pWInfo)).  
32300 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
32310 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
32320 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
32330 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
32340 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
32350 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
32360 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
32370 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
32380 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
32390 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
323a0 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
323b0 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
323c0 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
323d0 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
323e0 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
323f0 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
32400 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
32410 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
32420 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
32430 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
32440 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
32450 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
32460 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
32470 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
32480 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
32490 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
324a0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
324b0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
324c0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
324d0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
324e0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
324f0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
32500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32510 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
32520 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ta, sAggInfo.sor
32530 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32550 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74     sortOut, sort
32560 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  PTab);.      }. 
32570 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
32580 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
32590 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
325a0 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
325b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
325c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
325d0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74   OP_Column, sort
325e0 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  PTab, j, iBMem+j
325f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
32600 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
32610 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
32620 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
32630 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
32640 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
32650 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
32660 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
32670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
32680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
32690 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
326a0 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
326b0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
326c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326d0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
326e0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
326f0 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
32700 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
32710 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
32720 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
32730 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32740 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
32750 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20  _Jump, addr1+1, 
32760 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62  0, addr1+1); Vdb
32770 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
32780 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
32790 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
327a0 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
327b0 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
327c0 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
327d0 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
327e0 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
327f0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
32800 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
32810 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
32820 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
32830 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
32840 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
32850 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
32860 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
32870 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
32880 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
32890 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
328a0 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
328b0 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
328c0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
328d0 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
328e0 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
328f0 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
32900 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
32910 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
32920 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
32930 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
32940 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
32950 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
32960 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
32970 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
32980 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
32990 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
329a0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
329b0 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
329c0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
329d0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
329e0 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
329f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32a00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
32a10 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
32a20 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64  ag, addrEnd); Vd
32a30 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
32a40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
32a50 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
32a60 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
32a70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32a80 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
32a90 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
32aa0 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
32ab0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
32ac0 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
32ad0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
32ae0 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
32af0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
32b00 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
32b10 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
32b20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
32b30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
32b40 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
32b50 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
32b60 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
32b70 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
32b80 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
32b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
32ba0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
32bb0 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
32bc0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
32bd0 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
32be0 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
32bf0 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
32c00 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
32c10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32c20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
32c30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
32c40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32c50 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
32c60 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
32c70 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
32c80 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
32c90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
32ca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32cb0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
32cc0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
32cd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
32ce0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
32cf0 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
32d00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
32d10 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
32d20 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
32d30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
32d40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
32d50 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
32d60 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
32d70 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
32d80 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
32d90 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
32da0 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
32db0 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
32dc0 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
32dd0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
32de0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
32df0 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
32e00 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
32e10 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
32e20 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
32e30 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
32e40 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
32e50 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
32e60 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
32e70 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
32e80 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
32e90 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
32ea0 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
32eb0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
32ec0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
32ed0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
32ee0 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
32ef0 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
32f00 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
32f10 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
32f20 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
32f30 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
32f40 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
32f50 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
32f60 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
32f70 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
32f80 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
32f90 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
32fa0 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
32fb0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
32fc0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
32fd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
32fe0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
32ff0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
33000 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
33010 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
33020 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
33030 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
33040 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
33050 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
33060 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
33070 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
33080 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
33090 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
330a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
330b0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
330c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
330d0 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
330e0 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
330f0 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
33100 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
33110 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
33120 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
33130 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
33140 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
33150 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
33160 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
33170 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
33180 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
33190 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
331a0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
331b0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
331c0 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
331d0 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
331e0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
331f0 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
33200 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
33210 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
33220 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
33230 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20  t, -1, &sSort,. 
33240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33250 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c       &sDistinct,
33260 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20   pDest,.        
33270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64                ad
33280 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61  drOutputRow+1, a
33290 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20  ddrSetAbort);.  
332a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
332b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
332c0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
332d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
332e0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72  ment((v, "end gr
332f0 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e  oupby result gen
33300 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  erator"));..    
33310 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
33320 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
33330 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67  will reset the g
33340 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61  roup-by accumula
33350 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  tor.      */.   
33360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
33370 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
33380 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
33390 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
333a0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
333b0 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fo);.      sqlit
333c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
333d0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
333e0 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20  set);.     .    
333f0 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75  } /* endif pGrou
33400 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72  pBy.  Begin aggr
33410 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69  egate queries wi
33420 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20  thout GROUP BY: 
33430 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20  */.    else {.  
33440 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44      ExprList *pD
33450 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  el = 0;.#ifndef 
33460 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
33470 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62  ECOUNT.      Tab
33480 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
33490 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69  if( (pTab = isSi
334a0 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41  mpleCount(p, &sA
334b0 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20  ggInfo))!=0 ){. 
334c0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53         /* If isS
334d0 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74  impleCount() ret
334e0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
334f0 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  o a Table struct
33500 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ure, then.      
33510 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61    ** the SQL sta
33520 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  tement is of the
33530 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a   form:.        *
33540 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53  *.        **   S
33550 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
33560 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20  ROM <tbl>.      
33570 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
33580 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20  where the Table 
33590 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e  structure return
335a0 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61  ed represents ta
335b0 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20  ble <tbl>..     
335c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
335d0 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
335e0 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61  is so common tha
335f0 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65  t it is optimize
33600 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65  d specially. The
33610 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43  .        ** OP_C
33620 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ount instruction
33630 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74   is executed eit
33640 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65  her on the intke
33650 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20  y table that.   
33660 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
33670 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61   the data for ta
33680 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20  ble <tbl> or on 
33690 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78  one of its index
336a0 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a  es. It.        *
336b0 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65  * is better to e
336c0 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e  xecute the op on
336d0 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e   an index, as in
336e0 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74  dexes are almost
336f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
33700 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73  ys spread across
33710 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e   less pages than
33720 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e   their correspon
33730 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20  ding tables..   
33740 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33750 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20  const int iDb = 
33760 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
33770 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
33780 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
33790 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69  .        const i
337a0 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65  nt iCsr = pParse
337b0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
337c0 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20   Cursor to scan 
337d0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20  b-tree */.      
337e0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
337f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33800 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
33810 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
33820 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
33830 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20  pKeyInfo = 0;   
33840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
33850 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e  eyinfo for scann
33860 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ed index */.    
33870 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
33880 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33890 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
338a0 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20   index found so 
338b0 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  far */.        i
338c0 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d  nt iRoot = pTab-
338d0 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  >tnum;          
338e0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
338f0 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72   of scanned b-tr
33900 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73  ee */..        s
33910 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
33920 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
33930 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
33940 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
33950 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
33960 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
33970 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20  zName);..       
33980 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74   /* Search for t
33990 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61  he index that ha
339a0 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61  s the lowest sca
339b0 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20  n cost..        
339c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
339d0 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f  011-04-15) Do no
339e0 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e  t do a full scan
339f0 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64   of an unordered
33a00 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
33a10 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32  **.        ** (2
33a20 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f  013-10-03) Do no
33a30 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72  t count the entr
33a40 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c  ies in a partial
33a50 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
33a60 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
33a70 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65   practice the Ke
33a80 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
33a90 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
33aa0 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20  . It is only .  
33ab0 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20        ** passed 
33ac0 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52  to keep OP_OpenR
33ad0 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20  ead happy..     
33ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
33af0 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
33b00 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69  ) ) pBest = sqli
33b10 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
33b20 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20  ex(pTab);.      
33b30 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
33b40 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
33b50 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
33b60 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
33b70 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64  pIdx->bUnordered
33b80 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
33b90 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77  & pIdx->szIdxRow
33ba0 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a  <pTab->szTabRow.
33bb0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
33bc0 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
33bd0 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
33be0 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49  && (!pBest || pI
33bf0 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65  dx->szIdxRow<pBe
33c00 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20  st->szIdxRow).  
33c10 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
33c20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70         pBest = p
33c30 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Idx;.          }
33c40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33c50 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a     if( pBest ){.
33c60 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20            iRoot 
33c70 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20  = pBest->tnum;. 
33c80 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66           pKeyInf
33c90 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
33ca0 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
33cb0 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
33cc0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
33cd0 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Open a read-only
33ce0 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65   cursor, execute
33cf0 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63   the OP_Count, c
33d00 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
33d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
33d20 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
33d30 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c  (v, OP_OpenRead,
33d40 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44   iCsr, iRoot, iD
33d50 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  b, 1);.        i
33d60 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  f( pKeyInfo ){. 
33d70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33d80 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
33d90 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79  -1, (char *)pKey
33da0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
33db0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33dc0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75  AddOp2(v, OP_Cou
33de0 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e  nt, iCsr, sAggIn
33df0 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d  fo.aFunc[0].iMem
33e00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
33e10 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
33e20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b  OP_Close, iCsr);
33e30 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e  .        explain
33e40 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72  SimpleCount(pPar
33e50 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29  se, pTab, pBest)
33e60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
33e70 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
33e80 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a  MIT_BTREECOUNT *
33e90 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
33ea0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
33eb0 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e  e query is of on
33ec0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
33ed0 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20  ng forms:.      
33ee0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
33ef0 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20    SELECT min(x) 
33f00 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
33f10 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78   **   SELECT max
33f20 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20  (x) FROM ....   
33f30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
33f40 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
33f50 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69  n ask the code i
33f60 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74  n where.c to att
33f70 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73  empt to sort res
33f80 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ults.        ** 
33f90 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20  as if there was 
33fa0 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20  an "ORDER ON x" 
33fb0 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44  or "ORDER ON x D
33fc0 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20  ESC" clause. .  
33fd0 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72        ** If wher
33fe0 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70  e.c is able to p
33ff0 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73  roduce results s
34000 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72  orted in this or
34010 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  der, then.      
34020 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f    ** add vdbe co
34030 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  de to break out 
34040 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
34050 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65  g loop after the
34060 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72   .        ** fir
34070 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69  st iteration (si
34080 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74  nce the first it
34090 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  eration of the l
340a0 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20  oop is .        
340b0 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  ** guaranteed to
340c0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
340d0 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e  row with the min
340e0 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20  imum or maximum 
340f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  .        ** valu
34100 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79  e of x, the only
34110 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a   row required)..
34120 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
34130 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20     ** A special 
34140 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73  flag must be pas
34150 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68  sed to sqlite3Wh
34160 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c  ereBegin() to sl
34170 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a  ightly.        *
34180 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f  * modify behavio
34190 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  r as follows:.  
341a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
341b0 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
341c0 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
341d0 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
341e0 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
341f0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  y.        **    
34200 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20   where.c should 
34210 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72  not iterate over
34220 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68   any values with
34230 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20   a NULL value.  
34240 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
34250 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20   x..        **. 
34260 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68         **   + Th
34270 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65  e optimizer code
34280 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65   in where.c (the
34290 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69   thing that deci
342a0 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  des which.      
342b0 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f    **     index o
342c0 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65  r indices to use
342d0 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61  ) should place a
342e0 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72   different prior
342f0 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20  ity on .        
34300 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e  **     satisfyin
34310 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27  g the 'ORDER BY'
34320 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20   clause than it 
34330 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61  does in other ca
34340 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ses..        ** 
34350 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64      Refer to cod
34360 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69  e and comments i
34370 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65  n where.c for de
34380 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a  tails..        *
34390 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69  /.        ExprLi
343a0 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
343b0 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67  .        u8 flag
343c0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
343d0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20  _NORMAL;.       
343e0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
343f0 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ( p->pGroupBy==0
34400 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
34410 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20  rt( flag==0 );. 
34420 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48         if( p->pH
34430 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20  aving==0 ){.    
34440 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e        flag = min
34450 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e  MaxQuery(&sAggIn
34460 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20  fo, &pMinMax);. 
34470 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34480 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
34490 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20   || (pMinMax!=0 
344a0 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70  && pMinMax->nExp
344b0 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20  r==1) );..      
344c0 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20    if( flag ){.  
344d0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20          pMinMax 
344e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
344f0 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78  tDup(db, pMinMax
34500 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
34510 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a  pDel = pMinMax;.
34520 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
34530 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
34540 65 64 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30  ed || pMinMax!=0
34550 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
34560 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
34570 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
34580 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
34590 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61  .sortOrder = fla
345a0 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59  g!=WHERE_ORDERBY
345b0 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20  _MIN ?1:0;.     
345c0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e         pMinMax->
345d0 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d  a[0].pExpr->op =
345e0 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
345f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34600 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  }.  .        /* 
34610 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
34620 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
34630 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
34640 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
34650 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
34660 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c  ng is much simpl
34670 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  er since there i
34680 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
34690 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  row.        ** o
346a0 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
346b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73    */.        res
346c0 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  etAccumulator(pP
346d0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
346e0 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
346f0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
34700 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
34710 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
34720 4d 69 6e 4d 61 78 2c 20 30 2c 66 6c 61 67 2c 30  MinMax, 0,flag,0
34730 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
34740 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  WInfo==0 ){.    
34750 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
34760 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
34770 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  pDel);.         
34780 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
34790 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
347a0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
347b0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
347c0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
347d0 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61    assert( pMinMa
347e0 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d  x==0 || pMinMax-
347f0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20  >nExpr==1 );.   
34800 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
34810 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
34820 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20  WInfo)>0 ){.    
34830 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
34840 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33  eGoto(v, sqlite3
34850 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
34860 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20  pWInfo));.      
34870 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
34880 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64  (v, "%s() by ind
34890 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
348a0 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52       (flag==WHER
348b0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
348c0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
348d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
348e0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
348f0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
34900 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
34910 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
34920 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
34930 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  }..      sSort.p
34940 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
34950 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
34960 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
34970 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
34980 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
34990 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
349a0 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
349b0 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
349c0 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20  -1, 0, 0, .     
349d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349e0 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c   pDest, addrEnd,
349f0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20   addrEnd);.     
34a00 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
34a10 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
34a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
34a30 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
34a40 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
34a50 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
34a60 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
34a70 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69  ry */..  if( sDi
34a80 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
34a90 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
34aa0 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20  _UNORDERED ){.  
34ab0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
34ac0 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49 53 54  le(pParse, "DIST
34ad0 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  INCT");.  }..  /
34ae0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
34af0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
34b00 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74  , then we need t
34b10 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c  o sort the resul
34b20 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64  ts.  ** and send
34b30 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c   them to the cal
34b40 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65  lback one by one
34b50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f  ..  */.  if( sSo
34b60 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
34b70 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61     explainTempTa
34b80 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  ble(pParse,.    
34b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ba0 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20   sSort.nOBSat>0 
34bb0 3f 20 22 52 49 47 48 54 20 50 41 52 54 20 4f 46  ? "RIGHT PART OF
34bc0 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45   ORDER BY":"ORDE
34bd0 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65  R BY");.    gene
34be0 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61  rateSortTail(pPa
34bf0 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20  rse, p, &sSort, 
34c00 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
34c10 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Dest);.  }..  /*
34c20 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b   Jump here to sk
34c30 69 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  ip this query.  
34c40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
34c50 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
34c60 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  iEnd);..  /* The
34c70 20 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e   SELECT has been
34c80 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65   coded. If there
34c90 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20   is an error in 
34ca0 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74  the Parse struct
34cb0 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68  ure,.  ** set th
34cc0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
34cd0 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e   1. Otherwise 0.
34ce0 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72   */.  rc = (pPar
34cf0 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20  se->nErr>0);..  
34d00 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73  /* Control jumps
34d10 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65   to here if an e
34d20 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
34d30 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70  red above, or up
34d40 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  on.  ** successf
34d50 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65  ul coding of the
34d60 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65   SELECT..  */.se
34d70 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c  lect_end:.  expl
34d80 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50  ainSetInteger(pP
34d90 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
34da0 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49   iRestoreSelectI
34db0 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69  d);..  /* Identi
34dc0 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  fy column names 
34dd0 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  if results of th
34de0 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f 20  e SELECT are to 
34df0 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a  be output..  */.
34e00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34e10 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65 44  _OK && pDest->eD
34e20 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
34e30 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
34e40 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
34e50 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
34e60 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ist);.  }..  sql
34e70 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
34e80 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20  AggInfo.aCol);. 
34e90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
34ea0 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  b, sAggInfo.aFun
34eb0 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  c);.#if SELECTTR
34ec0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45  ACE_ENABLED.  SE
34ed0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
34ee0 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65  se,p,("end proce
34ef0 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50  ssing\n"));.  pP
34f00 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64  arse->nSelectInd
34f10 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20  ent--;.#endif.  
34f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a           return rc;.}.