/ Hex Artifact Content
Login

Artifact 948aa57117275e1f3c6713254ec2baae09be058bec40ab7dcc41960202b756e5:


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 0a 20  end(pParse, 0,. 
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50    sqlite3Expr(pP
1030: 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45  arse->db,TK_ASTE
1040: 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20  RISK,0));.  }.  
1050: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pNew->pEList = p
1060: 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f  EList;.  pNew->o
1070: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
1080: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
1090: 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e  = selFlags;.  pN
10a0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
10b0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
10c0: 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  = 0;.#if SELECTT
10d0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
10e0: 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d  New->zSelName[0]
10f0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
1100: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
1110: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
1120: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
1130: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
1140: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
1150: 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29  .  if( pSrc==0 )
1160: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44   pSrc = sqlite3D
1170: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
1180: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
1190: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
11a0: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
11b0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
11c0: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
11d0: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
11e0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
11f0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1200: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1210: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1220: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
1230: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
1240: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
1250: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
1260: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
1270: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  fset;.  pNew->pW
1280: 69 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ith = 0;.  asser
1290: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
12a0: 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50   pLimit!=0 || pP
12b0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 0a 20 20 20  arse->nErr>0.   
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
12e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
12f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
1300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1310: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
1320: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64  Select(pParse->d
1330: 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26  b, pNew, pNew!=&
1340: 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e  standin);.    pN
1350: 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ew = 0;.  }else{
1360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
1370: 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50  w->pSrc!=0 || pP
1380: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a  arse->nErr>0 );.
1390: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
13a0: 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a  ew!=&standin );.
13b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
13c0: 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
13d0: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
13e0: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
13f0: 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a  a Select object.
1400: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1410: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c  electSetName(Sel
1420: 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ect *p, const ch
1430: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
1440: 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a  ( p && zName ){.
1450: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1460: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a  intf(sizeof(p->z
1470: 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65  SelName), p->zSe
1480: 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61  lName, "%s", zNa
1490: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  me);.  }.}.#endi
14a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  f.../*.** Delete
14b0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
14c0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
14d0: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
14e0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
14f0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1500: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1510: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1520: 20 69 66 28 20 70 20 29 20 63 6c 65 61 72 53 65   if( p ) clearSe
1530: 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a  lect(db, p, 1);.
1540: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1550: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1560: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
1570: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1580: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
1590: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
15a0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
15b0: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
15c0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
15d0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
15e0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
15f0: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1600: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1610: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1620: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1630: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1640: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
1650: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
1660: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
1670: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
1680: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
1690: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
16a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
16b0: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
16c0: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
16d0: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
16e0: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
16f0: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1700: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1710: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1720: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1730: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1740: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
1750: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
1760: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1770: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
1780: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
1790: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
17a0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
17b0: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
17c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
17d0: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
17e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
17f0: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1800: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1810: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1820: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1830: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1840: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
1870: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1880: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
1890: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
18a0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
18b0: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
18c0: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
18d0: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
18e0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
18f0: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1900: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1910: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1920: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1930: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1940: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1950: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1960: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1970: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1980: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
1990: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
19a0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
19b0: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
19c0: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
19e0: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
19f0: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1a00: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1a10: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1a20: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1a30: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1a50: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1a60: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1a70: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1a80: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
1a90: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
1aa0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1ab0: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1ac0: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1af0: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1b00: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1b10: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1b20: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1b30: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1b40: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1b50: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1b60: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1b70: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1b80: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1b90: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1ba0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1bb0: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1bc0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1bd0: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1be0: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1bf0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1c00: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1c10: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1c20: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1c30: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1c40: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1c50: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1c60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c80: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1c90: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1ca0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1cb0: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1cc0: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1cd0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1ce0: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1cf0: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1d00: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1d10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1d20: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1d30: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1d40: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1d50: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1d60: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1d70: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1d80: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d90: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1da0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1db0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1dc0: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1dd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1de0: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1df0: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1e00: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1e10: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1e20: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1e30: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1e40: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1e50: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1e60: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1e70: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1e80: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1e90: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1ea0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1eb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ec0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1ed0: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1ee0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1ef0: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1f00: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1f10: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1f20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1f30: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1f40: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1f50: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1f60: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1f70: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1f80: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1f90: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1fa0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1fb0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1fc0: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1fd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1fe0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1ff0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
2000: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
2010: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
2020: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
2030: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
2040: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
2050: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
2060: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
2070: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
2080: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
2090: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
20a0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
20b0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
20c0: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
20d0: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
20e0: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
20f0: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
2100: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
2110: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
2120: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
2130: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
2140: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
2150: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
2160: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
2170: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
2180: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
2190: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
21a0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
21b0: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
21c0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
21d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21e0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
21f0: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
2200: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
2210: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
2220: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
2230: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
2240: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
2250: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
2260: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
2270: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
2280: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
2290: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
22a0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
22b0: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
22c0: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
22d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2300: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
2310: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2330: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
2340: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
2350: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
2360: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
2370: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
2380: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
2390: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
23a0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
23b0: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
23c0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
23d0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
23e0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
23f0: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2400: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2410: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2420: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2430: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2450: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2460: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2470: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
2480: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
2490: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
24a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
24b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
24c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24d0: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
24e0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
24f0: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2500: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2510: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2520: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2530: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2540: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
2550: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
2560: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
2570: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
2580: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
2590: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
25a0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
25b0: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
25c0: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
25d0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
25e0: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
25f0: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2600: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2610: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2630: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2640: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2660: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2670: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
2680: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
2690: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26b0: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
26c0: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
26d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
26e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2700: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2710: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2720: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2740: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
2750: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
2760: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
2770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2780: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
2790: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
27a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
27b0: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
27c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
27e0: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
27f0: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2820: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2830: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2840: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2850: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2860: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
2870: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
2880: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
2890: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
28a0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
28b0: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
28c0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
28d0: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
28e0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
28f0: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2900: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2910: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2930: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2940: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2950: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2960: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2970: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2980: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2990: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
29a0: 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45  , pE2);.  if( pE
29b0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
29c0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
29d0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
29e0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
29f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2a20: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2a30: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2a40: 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  pEq, EP_NoReduce
2a50: 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67  );.    pEq->iRig
2a60: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
2a70: 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a  16)pE2->iTable;.
2a80: 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d    }.  *ppWhere =
2a90: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2aa0: 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45  db, *ppWhere, pE
2ab0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  q);.}../*.** Set
2ac0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
2ad0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
2ae0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
2af0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
2b00: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
2b10: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2b20: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
2b30: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
2b40: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2b50: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
2b60: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2b70: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
2b80: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
2b90: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
2ba0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
2bb0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
2bc0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
2bd0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2be0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2bf0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2c00: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2c10: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2c20: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2c30: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2c40: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2c50: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2c60: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2c70: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2c80: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
2c90: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
2ca0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2cb0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
2cc0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
2cd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2ce0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2cf0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2d00: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2d10: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2d20: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2d30: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2d40: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2d50: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2d60: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2d70: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
2d80: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
2d90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2da0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
2db0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
2dc0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
2dd0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2de0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2df0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2e00: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2e10: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2e20: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2e30: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2e40: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2e50: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2e60: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2e70: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
2e80: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
2e90: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
2ea0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2eb0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
2ec0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
2ed0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2ee0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2ef0: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2f00: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2f10: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2f20: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2f30: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2f40: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2f50: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2f60: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2f70: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
2f80: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
2f90: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
2fa0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
2fb0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
2fc0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2fd0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2fe0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ff0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
3000: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
3010: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
3020: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c  etVVAProperty(p,
3030: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
3040: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
3050: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
3060: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ble;.    if( p->
3070: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
3080: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
3090: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
30a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
30b0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
30c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30d0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
30e0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
30f0: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3100: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3110: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
3120: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
3130: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
3140: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
3150: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
3160: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
3170: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
3180: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3190: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
31a0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
31b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
31c0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
31d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
31e0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
31f0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
3200: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
3210: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
3220: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
3230: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
3240: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
3250: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
3260: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
3270: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
3280: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
3290: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
32a0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
32b0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
32c0: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
32d0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
32e0: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
32f0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
3300: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
3310: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
3320: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
3330: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
3340: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
3350: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
3360: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
3370: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3380: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
3390: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
33a0: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
33b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33c0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
33d0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
33e0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
33f0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
3400: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
3410: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
3420: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
3430: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
3440: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
3450: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
3460: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
3470: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3490: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
34a0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34b0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
34c0: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
34d0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
34e0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34f0: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
3500: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
3510: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
3520: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
3530: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
3540: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
3550: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
3560: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3570: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
3580: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
3590: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
35a0: 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66  *pLeftTab = pLef
35b0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62  t->pTab;.    Tab
35c0: 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20  le *pRightTab = 
35d0: 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20  pRight->pTab;.  
35e0: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a    int isOuter;..
35f0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c      if( NEVER(pL
3600: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
3610: 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e  ghtTab==0) ) con
3620: 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74  tinue;.    isOut
3630: 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67  er = (pRight->fg
3640: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
3650: 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  UTER)!=0;..    /
3660: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
3670: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
3680: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
3690: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
36a0: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
36b0: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
36c0: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
36d0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
36e0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
36f0: 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
3700: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
3710: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3720: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
3730: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
3740: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3750: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
3760: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
3770: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
3780: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
3790: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
37a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
37b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
37c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
37d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
37e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
37f0: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
3800: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
3810: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
3820: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3830: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
3840: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
3850: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3860: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
3870: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
3880: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
3890: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
38a0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
38b0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
38c0: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
38d0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
38e0: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
38f0: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
3900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
3910: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
3930: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
3940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3950: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
3960: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
3970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3980: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3990: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
39a0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
39b0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
39c0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
39d0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
39e0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
39f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3a00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3a10: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
3a20: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
3a30: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
3a40: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
3a50: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
3a60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
3a70: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
3a80: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
3a90: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
3aa0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
3ab0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3ac0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3ad0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3ae0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3af0: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3b00: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3b10: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3b20: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3b30: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3b40: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3b50: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
3b60: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
3b70: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
3b80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
3b90: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
3ba0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
3bb0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3bc0: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3bd0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3be0: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3bf0: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3c00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3c10: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3c20: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3c30: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3c40: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3c50: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
3c60: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
3c70: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
3c80: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
3c90: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
3ca0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
3cb0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3cc0: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3cd0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3ce0: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3cf0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3d00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3d10: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3d20: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3d30: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3d40: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3d50: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
3d60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
3d70: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
3d80: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3d90: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
3da0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
3db0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3dc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3dd0: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3de0: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3df0: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3e00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3e10: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3e20: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3e30: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3e40: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3e50: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
3e60: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
3e70: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
3e80: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3e90: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
3ea0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
3eb0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3ec0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3ed0: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3ee0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3ef0: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3f00: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3f10: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3f20: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3f30: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3f40: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3f50: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
3f60: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3f70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3f80: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
3f90: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
3fa0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
3fb0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3fc0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3fd0: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3fe0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3ff0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
4000: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
4010: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
4020: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
4030: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
4040: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
4050: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
4060: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
4070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4090: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
40a0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
40b0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
40c0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
40d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
40e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
40f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4100: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
4110: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
4120: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
4130: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
4140: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
4150: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
4160: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
4170: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
4180: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
4190: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
41a0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
41b0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
41c0: 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  d */.);../*.** G
41d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
41e0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
41f0: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4200: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4210: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4220: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4230: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4240: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4250: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4260: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4270: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4280: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4290: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
42a0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
42b0: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
42c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
42d0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
42e0: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
42f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4300: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4310: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4320: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4330: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4340: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4350: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4360: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4370: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4380: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4390: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
43a0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
43b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
43c0: 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
43d0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
43e0: 6e 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20  nPrefixReg      
43f0: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67     /* No. of reg
4400: 20 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74   prior to regDat
4410: 61 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  a available for 
4420: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  use */.){.  Vdbe
4430: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4440: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4460: 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  Stmt under const
4470: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
4480: 20 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d   bSeq = ((pSort-
4490: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
44a0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
44b0: 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ==0);.  int nExp
44c0: 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  r = pSort->pOrde
44d0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20  rBy->nExpr;     
44e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
44f0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
4500: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65  s */.  int nBase
4510: 20 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20   = nExpr + bSeq 
4520: 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  + nData;        
4530: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
4540: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
4550: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  rd */.  int regB
4560: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73           /* Regs
4590: 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f   for sorter reco
45a0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  rd */.  int regR
45b0: 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65  ecord = ++pParse
45c0: 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
45d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65           /* Asse
45e0: 6d 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63  mbled sorter rec
45f0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42  ord */.  int nOB
4600: 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42  Sat = pSort->nOB
4610: 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44            /* ORD
4630: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73  ER BY terms to s
4640: 6b 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  kip */.  int op;
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4670: 70 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72  pcode to add sor
4680: 74 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f  ter record to so
4690: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rter */.  int iL
46a0: 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46c0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f  LIMIT counter */
46d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71  ..  assert( bSeq
46e0: 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29  ==0 || bSeq==1 )
46f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74  ;.  assert( nDat
4700: 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d  a==1 || regData=
4710: 3d 72 65 67 4f 72 69 67 44 61 74 61 20 7c 7c 20  =regOrigData || 
4720: 72 65 67 4f 72 69 67 44 61 74 61 3d 3d 30 20 29  regOrigData==0 )
4730: 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  ;.  if( nPrefixR
4740: 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  eg ){.    assert
4750: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45  ( nPrefixReg==nE
4760: 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20  xpr+bSeq );.    
4770: 72 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74  regBase = regDat
4780: 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53 65 71  a - nExpr - bSeq
4790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
47a0: 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
47b0: 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70  >nMem + 1;.    p
47c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
47d0: 42 61 73 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Base;.  }.  asse
47e0: 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  rt( pSelect->iOf
47f0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65  fset==0 || pSele
4800: 63 74 2d 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b  ct->iLimit!=0 );
4810: 0a 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c  .  iLimit = pSel
4820: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  ect->iOffset ? p
4830: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4840: 31 20 3a 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  1 : pSelect->iLi
4850: 6d 69 74 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61  mit;.  pSort->la
4860: 62 65 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  belDone = sqlite
4870: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4890: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
48a0: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64  rse, pSort->pOrd
48b0: 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 72  erBy, regBase, r
48c0: 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20 20  egOrigData,.    
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
48f0: 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69 67  L_DUP | (regOrig
4900: 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43 45  Data? SQLITE_ECE
4910: 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20 69  L_REF : 0));.  i
4920: 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73  f( bSeq ){.    s
4930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4940: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
4950: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4960: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4970: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65  ;.  }.  if( nPre
4980: 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44 61  fixReg==0 && nDa
4990: 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ta>0 ){.    sqli
49a0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
49b0: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
49c0: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 62   regBase+nExpr+b
49d0: 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  Seq, nData);.  }
49e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
49f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4a00: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e  ecord, regBase+n
4a10: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
4a20: 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Sat, regRecord);
4a30: 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20  .  if( nOBSat>0 
4a40: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72  ){.    int regPr
4a50: 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  evKey;   /* The 
4a60: 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c  first nOBSat col
4a70: 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76  umns of the prev
4a80: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
4a90: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
4aa0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
4ab0: 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63  the OP_IfNot opc
4ac0: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ode */.    int a
4ad0: 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20  ddrJmp;      /* 
4ae0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4af0: 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f  P_Jump opcode */
4b00: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4b10: 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  ;      /* Opcode
4b20: 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20   that opens the 
4b30: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
4b40: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
4b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72  /* Number of sor
4b60: 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  ting key columns
4b70: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53  , including OP_S
4b80: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b  equence */.    K
4b90: 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20  eyInfo *pKI;    
4ba0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79   /* Original Key
4bb0: 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74  Info on the sort
4bc0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  er table */..   
4bd0: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
4be0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
4bf0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4c00: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
4c10: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
4c20: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
4c30: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
4c40: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
4c50: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
4c60: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c70: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
4c80: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
4c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
4ca0: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4cb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4cc0: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
4cd0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
4cf0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d10: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
4d20: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
4d30: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
4d40: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
4d50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
4d60: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
4d70: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
4d80: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
4d90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
4da0: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
4db0: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
4dc0: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
4dd0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
4de0: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
4df0: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
4e00: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a  ->nKeyField); /*
4e10: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74   Makes OP_Jump t
4e20: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4e30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4e40: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4e50: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4e60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4e70: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20   pKI->nAllField 
4e80: 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  > pKI->nKeyField
4e90: 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  +2 );.    pOp->p
4ea0: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79  4.pKeyInfo = key
4eb0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
4ec0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
4ed0: 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74  pOrderBy, nOBSat
4ee0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
4f10: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
4f20: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
4f30: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
4f40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4f50: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
4f60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4f70: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
4f80: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
4f90: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
4fa0: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
4fb0: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
4fc0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4fd0: 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  l(v);.    pSort-
4fe0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
4ff0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5010: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
5020: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
5030: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
5040: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
5050: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5060: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
5070: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5080: 0a 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20  .    if( iLimit 
5090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
50b0: 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
50c0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65  pSort->labelDone
50d0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
50e0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
50f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5100: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46  umpHere(v, addrF
5110: 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  irst);.    sqlit
5120: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
5130: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
5140: 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72  regPrevKey, pSor
5150: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5160: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5170: 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b  ere(v, addrJmp);
5180: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
5190: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
51a0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
51b0: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f   ){.    op = OP_
51c0: 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20  SorterInsert;.  
51d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
51e0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20  OP_IdxInsert;.  
51f0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
5200: 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
5210: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
5220: 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61     regBase+nOBSa
5250: 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29  t, nBase-nOBSat)
5260: 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29  ;.  if( iLimit )
5270: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
5280: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30 3b 0a      int r1 = 0;.
5290: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
52a0: 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69 74 20  sorter until it 
52b0: 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54 2b 4f  contains LIMIT+O
52c0: 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e 20 20  FFSET entries.  
52d0: 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20 20 20  (The iLimit.    
52e0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73 20 69  ** register is i
52f0: 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74 68 20  nitialized with 
5300: 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54 2b 4f  value of LIMIT+O
5310: 46 46 53 45 54 2e 29 20 20 41 66 74 65 72 20 74  FFSET.)  After t
5320: 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20 2a 2a  he sorter.    **
5330: 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c 65 74   fills up, delet
5340: 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e 74 72  e the least entr
5350: 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20  y in the sorter 
5360: 61 66 74 65 72 20 65 61 63 68 20 69 6e 73 65 72  after each inser
5370: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73 20 77  t..    ** Thus w
5380: 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d 6f 72  e never hold mor
5390: 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d 49 54  e than the LIMIT
53a0: 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69 6e 20  +OFFSET rows in 
53b0: 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65 20 2a  memory at once *
53c0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  /.    addr = sql
53d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
53e0: 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  , OP_IfNotZero, 
53f0: 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
5400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5420: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72  v, OP_Last, pSor
5430: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
5440: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72    if( pSort->bOr
5450: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29  deredInnerLoop )
5460: 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 2b 2b 70  {.      r1 = ++p
5470: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5490: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
54a0: 6e 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  n, pSort->iECurs
54b0: 6f 72 2c 20 6e 45 78 70 72 2c 20 72 31 29 3b 0a  or, nExpr, r1);.
54c0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
54d0: 74 28 28 76 2c 20 22 73 65 71 22 29 29 3b 0a 20  t((v, "seq"));. 
54e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
54f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5500: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
5510: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
5520: 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72  f( pSort->bOrder
5530: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
5540: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
5550: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 64 72 69  nner loop is dri
5560: 76 65 6e 20 62 79 20 61 6e 20 69 6e 64 65 78 20  ven by an index 
5570: 73 75 63 68 20 74 68 61 74 20 76 61 6c 75 65 73  such that values
5580: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74   from.      ** t
5590: 68 65 20 73 61 6d 65 20 69 74 65 72 61 74 69 6f  he same iteratio
55a0: 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  n of the inner l
55b0: 6f 6f 70 20 61 72 65 20 69 6e 20 73 6f 72 74 65  oop are in sorte
55c0: 64 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  d order, then.  
55d0: 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
55e0: 6c 79 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  ly jump to the n
55f0: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
5600: 20 61 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69   an inner loop i
5610: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  f the.      ** e
5620: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 63 75  ntry from the cu
5630: 72 72 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  rrent iteration 
5640: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 69 6e 74  does not fit int
5650: 6f 20 74 68 65 20 74 6f 70 0a 20 20 20 20 20 20  o the top.      
5660: 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  ** LIMIT+OFFSET 
5670: 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
5680: 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  orter. */.      
5690: 69 6e 74 20 69 42 72 6b 20 3d 20 73 71 6c 69 74  int iBrk = sqlit
56a0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
56b0: 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20  r(v) + 2;.      
56c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56d0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 42  3(v, OP_Eq, regB
56e0: 61 73 65 2b 6e 45 78 70 72 2c 20 69 42 72 6b 2c  ase+nExpr, iBrk,
56f0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
5700: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5710: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
5720: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5730: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
5740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5750: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
5760: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
5770: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
5780: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
5790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
57a0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
57b0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
57c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
57d0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
57e0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
57f0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5800: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5810: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5820: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5830: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5840: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5850: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5860: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5870: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5880: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5890: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
58a0: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
58b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
58c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
58d0: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
58e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
58f0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
5900: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5910: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5920: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5930: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5940: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5950: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5960: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5970: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
5980: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
5990: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
59a0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
59b0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
59c0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
59d0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
59e0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
59f0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
5a00: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
5a10: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
5a20: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
5a30: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
5a40: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
5a50: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
5a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
5a70: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
5a80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5a90: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5aa0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5ab0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
5ac0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
5ad0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
5ae0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
5af0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
5b00: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
5b10: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
5b20: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
5b30: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
5b40: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
5b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
5b60: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
5b70: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
5b80: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
5b90: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
5ba0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
5bb0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5bc0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
5bd0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5be0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5bf0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
5c00: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
5c10: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
5c20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5c30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5c50: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
5c60: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
5c70: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5c80: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
5c90: 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e  Tab, r1, iMem, N
5ca0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5cb0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5cc0: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
5cd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5ce0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5cf0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
5d00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
5d10: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
5d20: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
5d30: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
5d40: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
5d50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
5d60: 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  b is negative, t
5d70: 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  hen the p->pELis
5d80: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5d90: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5da0: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5db0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5dc0: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5dd0: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5de0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5df0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5e00: 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69  cTab and p->pELi
5e10: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5e20: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e  .** to get the n
5e30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5e40: 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69   and the collati
5e50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
5e60: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
5e70: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
5e80: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
5e90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5eb0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5ec0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5ee0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
5ef0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5f00: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
5f10: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f20: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f30: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f40: 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   if non-negative
5f50: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f60: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f70: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f80: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f90: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5fa0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5fb0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5fc0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fd0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fe0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5ff0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
6000: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
6010: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
6020: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6030: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6040: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6050: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6060: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6070: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6090: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
60a0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
60b0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
60c0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60d0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60e0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
6100: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
6110: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
6120: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6130: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6140: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6150: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6160: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6170: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6180: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
61a0: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
61b0: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
61c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61d0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61e0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61f0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
6200: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
6210: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
6220: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6230: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6240: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6250: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6260: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6270: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6280: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6290: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
62a0: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
62b0: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
62c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62d0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62e0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62f0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
6300: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
6310: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
6320: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6330: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6340: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6350: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6360: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6370: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6380: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6390: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
63a0: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
63b0: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
63c0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63d0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63e0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63f0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
6400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6410: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
6420: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6430: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6440: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
6460: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61  EList!=0 );.  ha
6470: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73  sDistinct = pDis
6480: 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63  tinct ? pDistinc
6490: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57  t->eTnctType : W
64a0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
64b0: 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20  OP;.  if( pSort 
64c0: 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  && pSort->pOrder
64d0: 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20  By==0 ) pSort = 
64e0: 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  0;.  if( pSort==
64f0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
6500: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
6510: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b   iContinue!=0 );
6520: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
6530: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6540: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a  Continue);.  }..
6550: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
6560: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
6570: 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43  .  */.  nResultC
6580: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
6590: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
65a0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
65b0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
65c0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
65d0: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
65e0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
65f0: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6600: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6610: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6620: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6630: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6640: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6660: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
6670: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
6680: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6690: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
66a0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
66b0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
66c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
66d0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
66e0: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
66f0: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6700: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6710: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6720: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6730: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6740: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6750: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6760: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
6770: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
6780: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
6790: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
67a0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
67b0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
67c0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
67d0: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
67e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
67f0: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6800: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6810: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6820: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6830: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6840: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6850: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6860: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
6870: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
6880: 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20  ol;.  regOrig = 
6890: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
68a0: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20  t->iSdst;.  if( 
68b0: 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20  srcTab>=0 ){.   
68c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
68d0: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
68e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
68f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
6900: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
6910: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
6920: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
6930: 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69  v, "%s", p->pELi
6940: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29  st->a[i].zName))
6950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
6960: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
6970: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
6980: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6990: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
69a0: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
69b0: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
69c0: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
69d0: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
69e0: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
69f0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38  d..    */.    u8
6a00: 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20   ecelFlags;.    
6a10: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
6a20: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
6a30: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6a40: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6a50: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
6a60: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
6a70: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
6a80: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6a90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
6aa0: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
6ab0: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
6ac0: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
6ad0: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
6ae0: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
6af0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
6b00: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
6b10: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
6b20: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
6b30: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
6b40: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6b50: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
6b60: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
6b70: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
6b80: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
6b90: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
6ba0: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
6bb0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
6bc0: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
6bd0: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
6be0: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
6bf0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
6c00: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
6c10: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
6c20: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
6c30: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
6c40: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
6c50: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
6c60: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
6c70: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
6c80: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
6c90: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
6ca0: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
6cb0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
6cc0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
6cd0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70  ort->nOBSat; i<p
6ce0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
6cf0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6d00: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6d10: 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53 6f      if( (j = pSo
6d20: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt->pOrderBy->a[
6d30: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
6d40: 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ol)>0 ){.       
6d50: 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b     p->pEList->a[
6d60: 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  j-1].u.x.iOrderB
6d70: 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74  yCol = i+1-pSort
6d80: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20  ->nOBSat;.      
6d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6da0: 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20    regOrig = 0;. 
6db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
6dc0: 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65  st==SRT_Set || e
6dd0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20  Dest==SRT_Mem . 
6de0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65            || eDe
6df0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6e00: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
6e10: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a  Output );.    }.
6e20: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
6e30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6e40: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6e50: 70 2d 3e 70 45 4c 69 73 74 2c 72 65 67 52 65 73  p->pEList,regRes
6e60: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
6e90: 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  ecelFlags);.  }.
6ea0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
6eb0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
6ec0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
6ed0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6ee0: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
6ef0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
6f00: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
6f10: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
6f20: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
6f30: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
6f40: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
6f50: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
6f60: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
6f70: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
6f80: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
6f90: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
6fa0: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
6fb0: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
6fc0: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
6fd0: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
6fe0: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
6ff0: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7010: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
7020: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
7030: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
7040: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
7050: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
7060: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
7070: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
7080: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
7090: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
70a0: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
70b0: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
70c0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
70d0: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
70e0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
70f0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7100: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
7110: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
7120: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
7130: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
7140: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
7150: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
7160: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
7170: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
7180: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
7190: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
71a0: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
71b0: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
71c0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
71d0: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
71e0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
71f0: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
7200: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
7210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7220: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
7230: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
7240: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
7250: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
7260: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
7270: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
7280: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
7290: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
72a0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
72b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
72c0: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
72d0: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
72e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
72f0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
7300: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
7310: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
7320: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
7330: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
7340: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
7350: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7360: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
7370: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
7380: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
7390: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
73a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
73b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
73c0: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
73d0: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
73e0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
73f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7400: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7410: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
7420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7430: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
7440: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
7450: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
7460: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
7470: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
74a0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
74b0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
74c0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
74d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
74e0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
74f0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
7500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7520: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
7530: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
7540: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7550: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
7560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7570: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
7580: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
7590: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
75a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
75b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
75c0: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
75d0: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
75e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
75f0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
7600: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7610: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7630: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
7640: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7650: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
7660: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
7670: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
7680: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
7690: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
76a0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
76b0: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
76c0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
76f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7700: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7710: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
7720: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
7730: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
7740: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
7750: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
7760: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
7770: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
7780: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
7790: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
77a0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
77b0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
77c0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
77d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
77e0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
77f0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
7800: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
7810: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
7820: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7830: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7850: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
7860: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
7870: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
7880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7890: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
78a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
78b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
78c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
78d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
78e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
78f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
7900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7910: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
7920: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
7930: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
7940: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
7950: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
7960: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
7970: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
7980: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
7990: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
79a0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
79b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
79c0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
79d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
79e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
79f0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
7a00: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7a10: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
7a20: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
7a30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7a40: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7a50: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
7a60: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
7a70: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
7a80: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
7a90: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
7aa0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
7ab0: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
7ac0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
7ad0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
7ae0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
7af0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7b00: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7b10: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7b20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7b30: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7b40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7b50: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
7b60: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
7b70: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7b80: 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  ==SRT_Fifo );.  
7b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ba0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
7bb0: 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  o );.      sqlit
7bc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7be0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7bf0: 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78  tCol, r1+nPrefix
7c00: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
7c10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7c20: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
7c30: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20  RT_DistFifo ){. 
7c40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7c50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
7c60: 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63  DistFifo, then c
7c70: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
7c80: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
7c90: 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72  ** on an ephemer
7ca0: 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  al index. If the
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
7cc0: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
7cd0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
7ce0: 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20  e index, do not 
7cf0: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
7d00: 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20  output. If not, 
7d10: 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  add the.        
7d20: 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74  ** current row t
7d30: 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  o the index and 
7d40: 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69  proceed with wri
7d50: 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20  ting it to the. 
7d60: 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
7d70: 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20   table as well. 
7d80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7d90: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
7da0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
7db0: 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71   + 4;.        sq
7dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7dd0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
7de0: 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72  iParm+1, addr, r
7df0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
7e00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e20: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7e30: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7e40: 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73  arm+1, r1,regRes
7e50: 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult,nResultCol);
7e60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e70: 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20   pSort==0 );.   
7e80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7e90: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7ea0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
7eb0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
7ec0: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
7ed0: 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c  ixReg,regResult,
7ee0: 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  1,nPrefixReg);. 
7ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7f00: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
7f10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7f20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
7f30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f40: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7f50: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
7f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7f80: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
7f90: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
7fa0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7fb0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
7fc0: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
7fd0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7fe0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
7ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8000: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8010: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
8020: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
8030: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8040: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
8050: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
8060: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
8070: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
8080: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
8090: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
80a0: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
80b0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
80c0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
80d0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
80e0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
80f0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
8100: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
8110: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
8120: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8130: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
8140: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
8150: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
8160: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
8170: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
8180: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
8190: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
81a0: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
81b0: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
81c0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
81d0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
81e0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
81f0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
8200: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
8210: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
8220: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
8230: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
8240: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
8250: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
8260: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
8270: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
8280: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
8290: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
82a0: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
82b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
82c0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
82d0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
82e0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
82f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
8300: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
8310: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
8320: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
8330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8340: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8350: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8360: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
8370: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
8380: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
8390: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
83a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
83b0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
83c0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
83d0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
83e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
83f0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8400: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8410: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
8420: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8430: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8440: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8450: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
8460: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8470: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
8480: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
8490: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
84a0: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
84b0: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
84c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
84d0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
84e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
84f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8500: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
8510: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
8520: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
8530: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
8540: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
8550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8560: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
8570: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
8580: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
8590: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
85a0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
85b0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
85c0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
85d0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
85e0: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
85f0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8600: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
8610: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
8620: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8630: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
8640: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8650: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
8660: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
8670: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
8680: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
8690: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
86a0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
86b0: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
86c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
86d0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
86e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
86f0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
8700: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
8710: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8720: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
8730: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
8740: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
8750: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
8760: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
8770: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
8780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8790: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
87a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
87b0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
87c0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
87d0: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
87e0: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
87f0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
8800: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
8810: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
8820: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
8830: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
8840: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
8850: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
8860: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8870: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
8880: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8890: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
88a0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
88b0: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
88c0: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
88d0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
8900: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8910: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8920: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
8930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8940: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
8950: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
8960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8980: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8990: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
89a0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
89b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
89c0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
89d0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
89e0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
89f0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
8a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a10: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8a20: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
8a30: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
8a40: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
8a50: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
8a60: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
8a70: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
8a80: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
8a90: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
8aa0: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
8ab0: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
8ac0: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
8ad0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
8ae0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
8af0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
8b00: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
8b10: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
8b20: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
8b30: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
8b40: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
8b50: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
8b60: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
8b70: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
8b80: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
8b90: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
8ba0: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
8bb0: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
8bc0: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
8bd0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
8be0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
8bf0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
8c00: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
8c10: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
8c20: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
8c30: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
8c40: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
8c50: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
8c60: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
8c70: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
8c80: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8c90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8ca0: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
8cb0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
8cc0: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
8cd0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
8ce0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
8cf0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8d00: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8d10: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
8d20: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
8d30: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
8d40: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
8d50: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
8d60: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
8d70: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
8d80: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
8d90: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
8da0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
8db0: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
8dc0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
8dd0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
8de0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8df0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
8e00: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
8e30: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8e40: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
8e50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8e60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8e70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8e80: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8e90: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8ea0: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
8eb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8ec0: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ee0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8ef0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
8f00: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
8f10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8f20: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
8f30: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
8f40: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
8f50: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
8f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8f80: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
8fb0: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
8fc0: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
8ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9010: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
9020: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
9030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9040: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
9050: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
9060: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
9070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9080: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
9090: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
90a0: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
90b0: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
90c0: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
90d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
90e0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
90f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9100: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9110: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9120: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
9130: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
9140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9150: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
9160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
9170: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
9180: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9190: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
91a0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
91b0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
91c0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
91d0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
91e0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
91f0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
9200: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
9210: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
9220: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
9230: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
9240: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
9250: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
9260: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
9270: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
9280: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
9290: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
92a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
92b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
92c0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
92d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
92e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
92f0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
9300: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
9310: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
9320: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
9330: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
9340: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
9350: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
9360: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
9370: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
9380: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
9390: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
93a0: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
93b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
93c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
93d0: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
93e0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
93f0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
9400: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
9410: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
9420: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
9430: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
9440: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
9450: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
9460: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
9470: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
9480: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
9490: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
94a0: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
94b0: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
94c0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
94d0: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
94e0: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
94f0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
9500: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9510: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
9520: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
9530: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
9540: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
9550: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
9560: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
9570: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
9580: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
9590: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
95a0: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
95b0: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
95c0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
95d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
95e0: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
95f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9600: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
9610: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
9630: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
9640: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
9650: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
9660: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
9670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9680: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
9690: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
96a0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
96b0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
96c0: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
96d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
96e0: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
96f0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
9700: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
9710: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
9720: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
9730: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9750: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9760: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
9770: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
9780: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
9790: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
97a0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
97b0: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
97c0: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
97d0: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
97e0: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
97f0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
9800: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
9810: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
9820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9830: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
9840: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
9850: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
9860: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
9870: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
9880: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
9890: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
98a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
98b0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
98c0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
98d0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
98e0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
98f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
9900: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
9910: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
9920: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
9930: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
9940: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
9950: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
9960: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
9970: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
9980: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
9990: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
99a0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
99b0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
99c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
99d0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
99e0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
99f0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
9a00: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
9a10: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
9a20: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
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 61 70 70 72 6f 70 72  cture is appropr
9a50: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
9a60: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
9a70: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
9a80: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
9a90: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
9aa0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
9ab0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
9ac0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9ad0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
9ae0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
9af0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9b00: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9b10: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9b20: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
9b30: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
9b40: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
9b50: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
9b60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9b70: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
9b80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9b90: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9ba0: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
9bb0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9bc0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9bd0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9be0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9bf0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9c00: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9c10: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9c30: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
9c40: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
9c50: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
9c60: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
9c70: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
9c80: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9c90: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
9ca0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9cb0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
9cc0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9cd0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9ce0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9cf0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9d00: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9d10: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9d30: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
9d40: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
9d50: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
9d60: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
9d70: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
9d80: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9d90: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
9da0: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
9db0: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
9dc0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
9dd0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
9de0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
9df0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
9e00: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
9e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9e20: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
9e30: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
9e40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
9e50: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
9e60: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
9e70: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
9e80: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
9e90: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
9ea0: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
9eb0: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
9ec0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
9ed0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
9ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9ef0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
9f00: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9f20: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
9f30: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
9f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
9f50: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
9f60: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
9f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
9f80: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
9f90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9fa0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
9fb0: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
9fc0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
9fd0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
9fe0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
9ff0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a000: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a010: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a020: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a030: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a040: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a050: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
a060: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
a070: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
a080: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
a090: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
a0a0: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
a0b0: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
a0c0: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
a0d0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
a0e0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
a0f0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
a100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a110: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
a120: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
a140: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
a150: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
a160: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
a170: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a180: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
a190: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
a1a0: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
a1b0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
a1c0: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
a1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a1e0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
a1f0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
a200: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
a210: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
a220: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
a230: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
a240: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
a250: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
a260: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
a270: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
a280: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
a290: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
a2a0: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
a2b0: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
a2c0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
a2d0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
a2e0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
a2f0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
a300: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
a310: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
a320: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
a330: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
a340: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
a350: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
a360: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
a370: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
a380: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
a390: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
a3a0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
a3b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
a3c0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
a3d0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
a3e0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
a3f0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
a400: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
a410: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
a420: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
a430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a440: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
a450: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a460: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a470: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
a480: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
a490: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
a4a0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
a4b0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
a4c0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
a4d0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
a4e0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
a4f0: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
a500: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
a510: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
a520: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
a530: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
a540: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
a550: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
a560: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
a570: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
a580: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
a590: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
a5a0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
a5b0: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
a5c0: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
a5d0: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
a5e0: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
a5f0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
a600: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
a610: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
a620: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
a630: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
a640: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
a650: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
a660: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
a670: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
a680: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
a690: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
a6a0: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
a6b0: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
a6c0: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
a6d0: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
a6e0: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
a6f0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
a700: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
a710: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
a720: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
a730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
a760: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
a790: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
a7a0: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
a7b0: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7d0: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
a7e0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
a810: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
a820: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
a830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a840: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
a850: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
a860: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
a870: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
a880: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
a890: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
a8a0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
a8b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
a8c0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
a8d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a8e0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
a8f0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
a900: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
a910: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
a920: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
a930: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
a940: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
a950: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
a960: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
a970: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
a980: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
a990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a9a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a9b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a9c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a9d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a9e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
a9f0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
aa00: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
aa10: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
aa20: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
aa30: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
aa40: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
aa50: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
aa60: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
aa70: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
aa80: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
aa90: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
aaa0: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
aab0: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
aac0: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
aad0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
aae0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
aaf0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
ab00: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
ab10: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
ab20: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
ab30: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
ab40: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
ab50: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
ab60: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
ab70: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
ab80: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
ab90: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
aba0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
abb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
abc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
abd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
abe0: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
abf0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
ac00: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
ac10: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
ac20: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
ac30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
ac40: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
ac50: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
ac60: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
ac70: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
ac80: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
ac90: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
aca0: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
acb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
acc0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
acd0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
ace0: 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d  drBreak = pSort-
acf0: 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20  >labelDone;     
ad00: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
ad10: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
ad20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
ad30: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
ad40: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ad50: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
ad60: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
ad70: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
ad80: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
ad90: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
ada0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
adb0: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
adc0: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
add0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
ade0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
adf0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
ae00: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
ae10: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
ae20: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20  int iCol;.  int 
ae30: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
ae40: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
ae60: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
ae70: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
ae80: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
ae90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aea0: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
aeb0: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
aec0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
aed0: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
af00: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
af10: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20  s seq. no. */.  
af20: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
af30: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
af40: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
af50: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
af60: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
af70: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
af80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
af90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
afa0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
afb0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
afc0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
afd0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
afe0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
aff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b000: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
b010: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
b020: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
b030: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
b040: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b050: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
b060: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
b070: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
b080: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64   ){.    regRowid
b090: 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77   = 0;.    regRow
b0a0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
b0b0: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
b0c0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
b0d0: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
b0e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b0f0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
b100: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
b110: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
b120: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
b130: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
b140: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20 6e  nColumn;.  }.  n
b150: 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Key = pOrderBy->
b160: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
b170: 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f  OBSat;.  if( pSo
b180: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
b190: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
b1a0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  er ){.    int re
b1b0: 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61  gSortOut = ++pPa
b1c0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
b1d0: 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65  SortTab = pParse
b1e0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
b1f0: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
b200: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Out ){.      add
b210: 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56  rOnce = sqlite3V
b220: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
b230: 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
b240: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
b250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b260: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
b270: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
b280: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
b290: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
b2a0: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
b2b0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
b2c0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
b2d0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
b2e0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
b2f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b300: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
b310: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
b320: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b330: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b340: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b350: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
b360: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b370: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
b380: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
b390: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
b3a0: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
b3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
b3c0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
b3d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
b3e0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
b3f0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
b400: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
b410: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
b420: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
b430: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
b440: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
b450: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
b460: 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b  (i=0, iCol=nKey+
b470: 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44 61 74  bSeq; i<nSortDat
b480: 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  a; i++){.    int
b490: 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66 28 20   iRead;.    if( 
b4a0: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b4b0: 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20  rderByCol ){.   
b4c0: 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45     iRead = aOutE
b4d0: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
b4e0: 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  yCol-1;.    }els
b4f0: 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d  e{.      iRead =
b500: 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iCol++;.    }. 
b510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b520: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b530: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65  n, iSortTab, iRe
b540: 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  ad, regRow+i);. 
b550: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b560: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
b570: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
b580: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
b590: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
b5a0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
b5b0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
b5c0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
b5d0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
b5e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b5f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b600: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
b610: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
b620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b630: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b640: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
b650: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
b660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b670: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
b680: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
b690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
b6c0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
b6d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
b6e0: 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72  lumn==sqlite3Str
b6f0: 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66  len30(pDest->zAf
b700: 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20 20  fSdst) );.      
b710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b720: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
b730: 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  rd, regRow, nCol
b740: 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20  umn, regRowid,. 
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 41         pDest->zA
b770: 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  ffSdst, nColumn)
b780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b790: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
b7a0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
b7b0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
b7c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b7d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
b7e0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
b7f0: 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65  rm, regRowid, re
b800: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
b810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b820: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
b830: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  Mem: {.      /* 
b840: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
b850: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
b860: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
b870: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
b880: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b890: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b8a0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b8b0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b8c0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b8d0: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
b8e0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
b8f0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
b900: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b910: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
b920: 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  e );.      if( e
b930: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b940: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b950: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b960: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
b970: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
b980: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
b990: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
b9a0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
b9b0: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64  arse, pDest->iSd
b9c0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
b9d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b9f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
ba00: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
ba10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ba20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ba30: 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64  }.  if( regRowid
ba40: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73   ){.    if( eDes
ba50: 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20  t==SRT_Set ){.  
ba60: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ba70: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
ba80: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
ba90: 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  umn);.    }else{
baa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
bab0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
bac0: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
bad0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
bae0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
baf0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
bb00: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f  .  }.  /* The bo
bb10: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
bb20: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
bb30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
bb40: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
bb50: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
bb60: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
bb70: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
bb80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bb90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
bba0: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
bbb0: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
bbc0: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
bbd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bbe0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
bbf0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
bc00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bc10: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
bc20: 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c  >regReturn ) sql
bc30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
bc40: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f  , OP_Return, pSo
bc50: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  rt->regReturn);.
bc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
bc70: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
bc80: 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rBreak);.}../*.*
bc90: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
bca0: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
bcb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
bcc0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
bcd0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
bce0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
bcf0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
bd00: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
bd10: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
bd20: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74  **.** Also try t
bd30: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73  o estimate the s
bd40: 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ize of the retur
bd50: 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ned value and re
bd60: 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73  turn that.** res
bd70: 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74  ult in *pEstWidt
bd80: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  h..**.** The dec
bd90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
bda0: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
bdb0: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
bdc0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
bdd0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
bde0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
bdf0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
be00: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
be10: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
be20: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
be30: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
be40: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
be50: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
be60: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
be70: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
be80: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
be90: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
bea0: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
beb0: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
bec0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
bed0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
bee0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
bef0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
bf00: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
bf10: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
bf20: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
bf30: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
bf40: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
bf50: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
bf60: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
bf70: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
bf80: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
bf90: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
bfa0: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
bfb0: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
bfc0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
bfd0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
bfe0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
bff0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
c000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c010: 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20  tine has either 
c020: 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72  3 or 6 parameter
c030: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  s depending on w
c040: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
c050: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
c060: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c070: 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TA compile-time 
c080: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
c090: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
c0a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c0b0: 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65  ETADATA.# define
c0c0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
c0d0: 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70  C,D,E) columnTyp
c0e0: 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29  eImpl(A,B,C,D,E)
c0f0: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65  .#else /* if !de
c100: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
c110: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
c120: 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ATA) */.# define
c130: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
c140: 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70  C,D,E) columnTyp
c150: 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69  eImpl(A,B).#endi
c160: 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  f.static const c
c170: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49  har *columnTypeI
c180: 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  mpl(.  NameConte
c190: 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65  xt *pNC, .#ifnde
c1a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c1b0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c1c0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a 23 65    Expr *pExpr.#e
c1d0: 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45 78 70  lse.  Expr *pExp
c1e0: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
c1f0: 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f  **pzOrigDb,.  co
c200: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
c210: 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  gTab,.  const ch
c220: 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23  ar **pzOrigCol.#
c230: 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61 72 20  endif.){.  char 
c240: 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30  const *zType = 0
c250: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65  ;.  int j;.#ifde
c260: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c270: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c280: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
c290: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61  rigDb = 0;.  cha
c2a0: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61  r const *zOrigTa
c2b0: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
c2c0: 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  nst *zOrigCol = 
c2d0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
c2e0: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
c2f0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
c300: 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
c310: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
c320: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
c330: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
c340: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
c350: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
c360: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
c370: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
c380: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
c390: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
c3a0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
c3b0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
c3c0: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
c3d0: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
c3e0: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
c3f0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
c400: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
c410: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
c420: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
c430: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
c440: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
c450: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
c460: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
c470: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
c480: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
c490: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
c4a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c4b0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
c4c0: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
c4d0: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
c4e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
c4f0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
c500: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
c510: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
c520: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c530: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
c540: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
c550: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
c560: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
c570: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
c580: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
c590: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
c5a0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
c5b0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
c5c0: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
c5d0: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
c5e0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
c5f0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
c600: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
c610: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
c620: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
c630: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
c640: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
c650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c660: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
c670: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
c680: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c690: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
c6a0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
c6b0: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
c6c0: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
c6d0: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
c6e0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
c6f0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
c700: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
c710: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
c720: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
c730: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
c740: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
c750: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
c760: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
c770: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
c780: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
c790: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
c7a0: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
c7b0: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
c7c0: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
c7d0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
c7e0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
c7f0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
c800: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
c810: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
c820: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
c830: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
c840: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
c850: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
c860: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
c870: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
c880: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
c890: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
c8a0: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
c8b0: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
c8c0: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
c8d0: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
c8e0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
c8f0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
c900: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
c910: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
c920: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
c930: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
c940: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
c950: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
c960: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
c970: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
c980: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
c990: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
c9a0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
c9b0: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
c9c0: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
c9d0: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
c9e0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
c9f0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
ca00: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
ca10: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
ca20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
ca30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ca40: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
ca50: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
ca60: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
ca70: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
ca80: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
ca90: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
caa0: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
cab0: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
cac0: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
cad0: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
cae0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
caf0: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
cb00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
cb10: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
cb20: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
cb30: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
cb40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
cb50: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
cb60: 20 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74   iCol<pS->pEList
cb70: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
cb80: 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20       /* If iCol 
cb90: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
cba0: 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  o, then the expr
cbb0: 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20  ession requests 
cbc0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
cbd0: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75   rowid of the su
cbe0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
cbf0: 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  . This expressio
cc00: 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20  n is legal (see 
cc10: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
cc20: 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e  st case misc2.2.
cc30: 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65  2) - it always e
cc40: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
cc50: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
cc60: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
cc70: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
cc80: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
cc90: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
cca0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
ccb0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
ccc0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
ccd0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
cce0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  = pNC;.         
ccf0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
cd00: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
cd10: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
cd20: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
cd30: 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54  &zOrigDb,&zOrigT
cd40: 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a  ab,&zOrigCol); .
cd50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cd60: 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e  }else if( pTab->
cd70: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
cd80: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
cd90: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  le */.        as
cda0: 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20  sert( !pS );.   
cdb0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
cdc0: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
cdd0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73  PKey;.        as
cde0: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
cdf0: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
ce00: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
ce10: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ce20: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
ce30: 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20 69  TADATA.        i
ce40: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
ce50: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
ce60: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
ce70: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22      zOrigCol = "
ce80: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
ce90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
cea0: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
ceb0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
cec0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  me;.          zT
ced0: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  ype = sqlite3Col
cee0: 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61  umnType(&pTab->a
cef0: 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20  Col[iCol],0);.  
cf00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cf10: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
cf20: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
cf30: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
cf40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
cf50: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
cf60: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
cf70: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
cf80: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
cf90: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
cfa0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
cfb0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
cfc0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
cfd0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
cfe0: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
cff0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
d000: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
d010: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d020: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
d030: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
d040: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
d050: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
d060: 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
d070: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
d080: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d090: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
d0a0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
d0b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
d0c0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62  ression is a sub
d0d0: 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20  -select. Return 
d0e0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
d0f0: 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  type and.      *
d100: 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f  * origin info fo
d110: 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c  r the single col
d120: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
d130: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
d140: 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ECT.      ** sta
d150: 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f  tement..      */
d160: 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  .      NameConte
d170: 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65  xt sNC;.      Se
d180: 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72  lect *pS = pExpr
d190: 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ->x.pSelect;.   
d1a0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
d1b0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
d1c0: 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
d1d0: 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  t( ExprHasProper
d1e0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
d1f0: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
d200: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
d210: 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20  pS->pSrc;.      
d220: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
d230: 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73  .      sNC.pPars
d240: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
d250: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63  .      zType = c
d260: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
d270: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
d280: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
d290: 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  l); .      break
d2a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
d2b0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
d2c0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
d2d0: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
d2e0: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
d2f0: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
d300: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
d310: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
d320: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
d330: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
d340: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
d350: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
d360: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
d370: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
d380: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d390: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
d3a0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
d3b0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d3c0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
d3d0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d3e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
d3f0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
d400: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
d410: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
d420: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
d430: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
d440: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
d450: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
d460: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
d470: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d480: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
d490: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
d4a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d4b0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
d4c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
d4d0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
d4e0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
d4f0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
d500: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
d510: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
d520: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  arse;.  sNC.pNex
d530: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
d540: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d550: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d560: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
d570: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
d580: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
d590: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d5a0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
d5b0: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
d5c0: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
d5d0: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
d5e0: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
d5f0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
d600: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
d610: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d620: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d630: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
d640: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29 3b  Tab, &zOrigCol);
d650: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62  ..    /* The vdb
d660: 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20  e must make its 
d670: 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20  own copy of the 
d680: 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20  column-type and 
d690: 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f  other .    ** co
d6a0: 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74  lumn specific st
d6b0: 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74  rings, in case t
d6c0: 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65 73  he schema is res
d6d0: 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20  et before this. 
d6e0: 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61     ** virtual ma
d6f0: 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64  chine is deleted
d700: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
d710: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
d720: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
d730: 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67  _DATABASE, zOrig
d740: 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  Db, SQLITE_TRANS
d750: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
d760: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d770: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54  (v, i, COLNAME_T
d780: 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20  ABLE, zOrigTab, 
d790: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d7a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d7b0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d7c0: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d  i, COLNAME_COLUM
d7d0: 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c  N, zOrigCol, SQL
d7e0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d7f0: 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20  #else.    zType 
d800: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
d810: 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
d820: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
d830: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d840: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
d850: 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20  ECLTYPE, zType, 
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 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
d880: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d890: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20  _OMIT_DECLTYPE) 
d8a0: 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.}.../*.** Com
d8b0: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
d8c0: 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c 45  names for a SELE
d8d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
d8e0: 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61  .** The only gua
d8f0: 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69  rantee that SQLi
d900: 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63  te makes about c
d910: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74  olumn names is t
d920: 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f  hat if the.** co
d930: 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63  lumn has an AS c
d940: 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20  lause assigning 
d950: 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20  it a name, that 
d960: 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65  will be the name
d970: 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69   used..** That i
d980: 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d  s the only docum
d990: 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e  ented guarantee.
d9a0: 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74    However, count
d9b0: 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  less application
d9c0: 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f  s.** developed o
d9d0: 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61  ver the years ha
d9e0: 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73  ve made baseless
d9f0: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f   assumptions abo
da00: 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  ut column names.
da10: 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61  ** and will brea
da20: 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d  k if those assum
da30: 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20  ptions changes. 
da40: 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72   Hence, use extr
da50: 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77  eme caution.** w
da60: 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
da70: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76  is routine to av
da80: 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67  oid breaking leg
da90: 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41  acy..**.** See A
daa0: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c 75  lso: sqlite3Colu
dab0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
dac0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41 47  ).**.** The PRAG
dad0: 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f  MA short_column_
dae0: 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d 41  names and PRAGMA
daf0: 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d   full_column_nam
db00: 65 73 20 73 65 74 74 69 6e 67 73 20 61 72 65 0a  es settings are.
db10: 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20 20  ** deprecated.  
db20: 54 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  The default sett
db30: 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e 2c  ing is short=ON,
db40: 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e 39   full=OFF.  99.9
db50: 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70 6c  % of all.** appl
db60: 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20  ications should 
db70: 6f 70 65 72 61 74 65 20 74 68 69 73 20 77 61 79  operate this way
db80: 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
db90: 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70 70   we need to supp
dba0: 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ort the.** other
dbb0: 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61 63   modes for legac
dbc0: 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72  y:.**.**    shor
dbd0: 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46 3a  t=OFF, full=OFF:
dbe0: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61 6d        Column nam
dbf0: 65 20 69 73 20 74 68 65 20 74 65 78 74 20 6f 66  e is the text of
dc00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
dc10: 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20 20  has it.**       
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 6c         originall
dc40: 79 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  y appears in the
dc50: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
dc60: 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20 20  t.  In.**       
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc80: 20 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f 72         other wor
dc90: 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f 66  ds, the zSpan of
dca0: 20 74 68 65 20 72 65 73 75 6c 74 20 65 78 70 72   the result expr
dcb0: 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ession..**.**   
dcc0: 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d   short=ON, full=
dcd0: 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68 69 73  OFF:       (This
dce0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
dcf0: 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74 68  setting).  If th
dd00: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20  e result.**     
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 72 65 66 65 72 73 20           refers 
dd30: 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61  directly to a ta
dd40: 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  ble column, then
dd50: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c 75       result colu
dd80: 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20  mn name is just 
dd90: 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  the table column
dda0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddc0: 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20 20   name: COLUMN.  
ddd0: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a 53  Otherwise use zS
dde0: 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66 75  pan..**.**    fu
ddf0: 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e 59  ll=ON, short=ANY
de00: 3a 20 20 20 20 20 20 20 49 66 20 74 68 65 20 72  :       If the r
de10: 65 73 75 6c 74 20 72 65 66 65 72 73 20 64 69 72  esult refers dir
de20: 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c 65  ectly to a table
de30: 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20 20   column,.**     
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de50: 20 20 20 20 20 20 20 20 20 74 68 65 6e 20 74 68           then th
de60: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
de70: 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 74 61  name with the ta
de80: 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20 20  ble name.**     
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 2c           prefix,
deb0: 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d   ex: TABLE.COLUM
dec0: 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73  N.  Otherwise us
ded0: 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61 74  e zSpan..*/.stat
dee0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
def0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
df00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
df10: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
df20: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
df30: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f 2a   *pSelect     /*
df40: 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d 6e   Generate column
df50: 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20   names for this 
df60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
df70: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
df80: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
df90: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62  ;.  int i;.  Tab
dfa0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63 4c  le *pTab;.  SrcL
dfb0: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
dfc0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
dfd0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
dfe0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
dff0: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20 20   int fullName;  
e000: 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55 4d    /* TABLE.COLUM
e010: 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
e020: 65 20 61 6e 64 20 69 73 20 61 20 64 69 72 65 63  e and is a direc
e030: 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a 20  t table ref */. 
e040: 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20 20   int srcName;   
e050: 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20 54    /* COLUMN or T
e060: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e  ABLE.COLUMN if n
e070: 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20  o AS clause and 
e080: 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23 69  is direct */..#i
e090: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e0a0: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
e0b0: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
e0c0: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
e0d0: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
e0e0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
e0f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e100: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
e110: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
e120: 65 74 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  et || db->malloc
e130: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
e140: 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d  .  /* Column nam
e150: 65 73 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65  es are determine
e160: 64 20 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f  d by the left-mo
e170: 73 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d  st term of a com
e180: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a  pound select */.
e190: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
e1a0: 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
e1b0: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
e1c0: 72 69 6f 72 3b 0a 20 20 70 54 61 62 4c 69 73 74  rior;.  pTabList
e1d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
e1e0: 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  ;.  pEList = pSe
e1f0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
e200: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
e210: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 4c 69    assert( pTabLi
e220: 73 74 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  st!=0 );.  pPars
e230: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
e240: 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d   1;.  fullName =
e250: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
e260: 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
e270: 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65  s)!=0;.  srcName
e280: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
e290: 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
e2a0: 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c  ames)!=0 || full
e2b0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 56  Name;.  sqlite3V
e2c0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
e2d0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
e2e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
e2f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
e300: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d  ){.    Expr *p =
e310: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
e320: 78 70 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  xpr;..    assert
e330: 28 20 70 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ( p!=0 );.    as
e340: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
e350: 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f  AGG_COLUMN );  /
e360: 2a 20 41 67 67 20 70 72 6f 63 65 73 73 69 6e 67  * Agg processing
e370: 20 68 61 73 20 6e 6f 74 20 72 75 6e 20 79 65 74   has not run yet
e380: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
e390: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
e3a0: 20 7c 7c 20 70 2d 3e 70 54 61 62 21 3d 30 20 29   || p->pTab!=0 )
e3b0: 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64  ; /* Covering id
e3c0: 78 20 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20  x not yet coded 
e3d0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  */.    if( pELis
e3e0: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b  t->a[i].zName ){
e3f0: 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20  .      /* An AS 
e400: 63 6c 61 75 73 65 20 61 6c 77 61 79 73 20 74 61  clause always ta
e410: 6b 65 73 20 66 69 72 73 74 20 70 72 69 6f 72 69  kes first priori
e420: 74 79 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  ty */.      char
e430: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
e440: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
e450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e460: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
e470: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
e480: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ame, SQLITE_TRAN
e490: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
e4a0: 65 20 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26  e if( srcName &&
e4b0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
e4c0: 4e 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N ){.      char 
e4d0: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
e4e0: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
e4f0: 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  mn;.      pTab =
e500: 20 70 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20   p->pTab;.      
e510: 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
e520: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
e530: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
e540: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
e550: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
e560: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
e570: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
e580: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43   );.      if( iC
e590: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
e5a0: 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  zCol = "rowid";.
e5b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e5c0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
e5d0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
e5e0: 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  me;.      }.    
e5f0: 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29    if( fullName )
e600: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
e610: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
e620: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
e630: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
e640: 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
e650: 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  me, zCol);.     
e660: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
e670: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
e680: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61  OLNAME_NAME, zNa
e690: 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d  me, SQLITE_DYNAM
e6a0: 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IC);.      }else
e6b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e6c0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e6d0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
e6e0: 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45  ME, zCol, SQLITE
e6f0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
e700: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
e710: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e720: 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *z = pEList->a[
e730: 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  i].zSpan;.      
e740: 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74  z = z==0 ? sqlit
e750: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63  e3MPrintf(db, "c
e760: 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a  olumn%d", i+1) :
e770: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
e780: 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  (db, z);.      s
e790: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
e7a0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
e7b0: 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49  ME_NAME, z, SQLI
e7c0: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
e7d0: 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74   }.  }.  generat
e7e0: 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61  eColumnTypes(pPa
e7f0: 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
e800: 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  EList);.}../*.**
e810: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
e820: 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68  sion list (which
e830: 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c   is really the l
e840: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
e850: 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20  ns.** that form 
e860: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
e870: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
e880: 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70  ment) compute ap
e890: 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c  propriate.** col
e8a0: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20  umn names for a 
e8b0: 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64  table that would
e8c0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
e8d0: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
e8e0: 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   All column name
e8f0: 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65  s will be unique
e900: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
e910: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   column names ar
e920: 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c  e computed.  Col
e930: 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d  umn.zType, Colum
e940: 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20  n.zColl,.** and 
e950: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
e960: 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65  Column are zeroe
e970: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
e980: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
e990: 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f  cess.  If a memo
e9a0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
e9b0: 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73  ror occurs,.** s
e9c0: 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61  tore NULL in *pa
e9d0: 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e  Col and 0 in *pn
e9e0: 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53  Col and return S
e9f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a  QLITE_NOMEM..**.
ea00: 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72  ** The only guar
ea10: 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c 69 74  antee that SQLit
ea20: 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f  e makes about co
ea30: 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68  lumn names is th
ea40: 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  at if the.** col
ea50: 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c  umn has an AS cl
ea60: 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69  ause assigning i
ea70: 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77  t a name, that w
ea80: 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20  ill be the name 
ea90: 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73  used..** That is
eaa0: 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65   the only docume
eab0: 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20  nted guarantee. 
eac0: 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c   However, countl
ead0: 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ess applications
eae0: 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76  .** developed ov
eaf0: 65 72 20 74 68 65 20 79 65 61 72 73 20 68 61 76  er the years hav
eb00: 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20  e made baseless 
eb10: 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75  assumptions abou
eb20: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a  t column names.*
eb30: 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b  * and will break
eb40: 20 69 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70   if those assump
eb50: 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20  tions changes.  
eb60: 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65  Hence, use extre
eb70: 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68  me caution.** wh
eb80: 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69  en modifying thi
eb90: 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f  s routine to avo
eba0: 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61  id breaking lega
ebb0: 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c  cy..**.** See Al
ebc0: 73 6f 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  so: generateColu
ebd0: 6d 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74  mnNames().*/.int
ebe0: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
ebf0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
ec00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ec10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
ec20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
ec30: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
ec40: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c         /* Expr l
ec50: 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ist from which t
ec60: 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20  o derive column 
ec70: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a  names */.  i16 *
ec80: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
ec90: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
eca0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
ecb0: 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75  s here */.  Colu
ecc0: 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20  mn **paCol      
ecd0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
ece0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   new column list
ecf0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
ed00: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ed10: 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74  se->db;   /* Dat
ed20: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ed30: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ed60: 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b  rs */.  u32 cnt;
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64      /* Index add
ed90: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  ed to make the n
eda0: 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20  ame unique */.  
edb0: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
edc0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Col;        /* F
edd0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
ede0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
edf0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
ee20: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
ee30: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72  lt set */.  char
ee40: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
ee50: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
ee60: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  n name */.  int 
ee70: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
ee80: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
ee90: 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65  of name in zName
eea0: 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b  [] */.  Hash ht;
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
eed0: 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  e of column name
eee0: 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48  s */..  sqlite3H
eef0: 61 73 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20  ashInit(&ht);.  
ef00: 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20  if( pEList ){.  
ef10: 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d    nCol = pEList-
ef20: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c  >nExpr;.    aCol
ef30: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
ef40: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
ef50: 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29  f(aCol[0])*nCol)
ef60: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
ef70: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  aCol==0 );.  }el
ef80: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30  se{.    nCol = 0
ef90: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a  ;.    aCol = 0;.
efa0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43    }.  assert( nC
efb0: 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b  ol==(i16)nCol );
efc0: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
efd0: 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f  ;.  *paCol = aCo
efe0: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l;..  for(i=0, p
eff0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
f000: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
f010: 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c  ailed; i++, pCol
f020: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
f030: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
f040: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
f050: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  mn.    */.    if
f060: 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  ( (zName = pELis
f070: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d  t->a[i].zName)!=
f080: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
f090: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74   the column cont
f0a0: 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d  ains an "AS <nam
f0b0: 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20  e>" phrase, use 
f0c0: 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61  <name> as the na
f0d0: 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b  me */.    }else{
f0e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
f0f0: 6c 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  lExpr = sqlite3E
f100: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
f110: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
f120: 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  r);.      while(
f130: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
f140: 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20  K_DOT ){.       
f150: 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c   pColExpr = pCol
f160: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
f170: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
f180: 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  olExpr!=0 );.   
f190: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
f1a0: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
f1b0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 43 6f 6c 45  _COLUMN || pColE
f1c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
f1d0: 43 4f 4c 55 4d 4e 29 0a 20 20 20 20 20 20 20 26  COLUMN).       &
f1e0: 26 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62  & pColExpr->pTab
f1f0: 21 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  !=0 .      ){.  
f200: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
f210: 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c  umns use the col
f220: 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f  umn name name */
f230: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
f240: 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43  l = pColExpr->iC
f250: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54  olumn;.        T
f260: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43 6f  able *pTab = pCo
f270: 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  lExpr->pTab;.   
f280: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
f290: 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
f2a0: 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e  PKey;.        zN
f2b0: 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  ame = iCol>=0 ? 
f2c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
f2d0: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
f2e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f2f0: 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
f300: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
f310: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
f320: 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78  sProperty(pColEx
f330: 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  pr, EP_IntValue)
f340: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   );.        zNam
f350: 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e  e = pColExpr->u.
f360: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  zToken;.      }e
f370: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
f380: 55 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  Use the original
f390: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c   text of the col
f3a0: 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61  umn expression a
f3b0: 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  s its name */.  
f3c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 45        zName = pE
f3d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
f3e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f3f0: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
f400: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
f410: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
f420: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
f430: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  else{.      zNam
f440: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
f450: 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e 25 64 22  tf(db,"column%d"
f460: 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ,i+1);.    }..  
f470: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f480: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
f490: 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68  s unique.  If th
f4a0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e  e name is not un
f4b0: 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70  ique,.    ** app
f4c0: 65 6e 64 20 61 6e 20 69 6e 74 65 67 65 72 20 74  end an integer t
f4d0: 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68  o the name so th
f4e0: 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e  at it becomes un
f4f0: 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ique..    */.   
f500: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
f510: 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26 20 73 71  ile( zName && sq
f520: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 68  lite3HashFind(&h
f530: 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  t, zName)!=0 ){.
f540: 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71        nName = sq
f550: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
f560: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
f570: 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 20  nName>0 ){.     
f580: 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31     for(j=nName-1
f590: 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69 74 65 33  ; j>0 && sqlite3
f5a0: 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d  Isdigit(zName[j]
f5b0: 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20 20 20 20  ); j--){}.      
f5c0: 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d    if( zName[j]==
f5d0: 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b  ':' ) nName = j;
f5e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
f5f0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
f600: 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 7a 3a  rintf(db, "%.*z:
f610: 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d  %u", nName, zNam
f620: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
f630: 20 69 66 28 20 63 6e 74 3e 33 20 29 20 73 71 6c   if( cnt>3 ) sql
f640: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
f650: 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20 26 63 6e  sizeof(cnt), &cn
f660: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  t);.    }.    pC
f670: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  ol->zName = zNam
f680: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  e;.    sqlite3Co
f690: 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72  lumnPropertiesFr
f6a0: 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f 6c 29 3b  omName(0, pCol);
f6b0: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 26  .    if( zName &
f6c0: 26 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  & sqlite3HashIns
f6d0: 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d 65 2c 20  ert(&ht, zName, 
f6e0: 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20  pCol)==pCol ){. 
f6f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46       sqlite3OomF
f700: 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  ault(db);.    }.
f710: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
f720: 68 43 6c 65 61 72 28 26 68 74 29 3b 0a 20 20 69  hClear(&ht);.  i
f730: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f740: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
f750: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
f760: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
f770: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
f780: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
f790: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f7a0: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
f7b0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
f7c0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
f7d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f7e0: 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  M_BKPT;.  }.  re
f7f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f800: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
f810: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
f820: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
f830: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
f840: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
f850: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
f860: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
f870: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
f880: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
f890: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
f8a0: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
f8b0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
f8c0: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
f8d0: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
f8e0: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
f8f0: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
f900: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
f910: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
f920: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
f930: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
f940: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
f950: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
f960: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
f970: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
f980: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
f990: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
f9a0: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
f9b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f9c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
f9d0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
f9e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
f9f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
fa00: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
fa10: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
fa20: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
fa30: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
fa40: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
fa50: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
fa60: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
fa70: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
fa80: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
fa90: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
faa0: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
fab0: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
fac0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
fad0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
fae0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
faf0: 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  m *a;..  assert(
fb00: 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20   pSelect!=0 );. 
fb10: 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63   assert( (pSelec
fb20: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
fb30: 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b  _Resolved)!=0 );
fb40: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
fb50: 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e  >nCol==pSelect->
fb60: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c  pEList->nExpr ||
fb70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
fb80: 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  d );.  if( db->m
fb90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
fba0: 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26  turn;.  memset(&
fbb0: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
fbc0: 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63  NC));.  sNC.pSrc
fbd0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
fbe0: 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c  pSrc;.  a = pSel
fbf0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a  ect->pEList->a;.
fc00: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
fc10: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54  pTab->aCol; i<pT
fc20: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ab->nCol; i++, p
fc30: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  Col++){.    cons
fc40: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
fc50: 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20     int n, m;.   
fc60: 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b   p = a[i].pExpr;
fc70: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
fc80: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
fc90: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 2f   0, 0, 0);.    /
fca0: 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20  * pCol->szEst = 
fcb0: 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e 20 73 69  ... // Column si
fcc0: 7a 65 20 65 73 74 20 66 6f 72 20 53 45 4c 45 43  ze est for SELEC
fcd0: 54 20 74 61 62 6c 65 73 20 6e 65 76 65 72 20 75  T tables never u
fce0: 73 65 64 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 2d  sed */.    pCol-
fcf0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
fd00: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
fd10: 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70  p);.    if( zTyp
fd20: 65 20 26 26 20 28 6d 20 3d 20 73 71 6c 69 74 65  e && (m = sqlite
fd30: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
fd40: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  )>0 ){.      n =
fd50: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
fd60: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
fd70: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
fd80: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
fd90: 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c 20 70 43  locOrFree(db, pC
fda0: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b 6d 2b 32  ol->zName, n+m+2
fdb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
fdc0: 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  l->zName ){.    
fdd0: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 43 6f 6c      memcpy(&pCol
fde0: 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c 20 7a 54  ->zName[n+1], zT
fdf0: 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20 20 20 20  ype, m+1);.     
fe00: 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67     pCol->colFlag
fe10: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 41 53  s |= COLFLAG_HAS
fe20: 54 59 50 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  TYPE;.      }.  
fe30: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 6f 6c    }.    if( pCol
fe40: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
fe50: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
fe60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
fe70: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
fe80: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
fe90: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
fea0: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
feb0: 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  ol->zColl==0 ){.
fec0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
fed0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
fee0: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
fef0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
ff00: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
ff10: 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79 20 6e 6f  w = 1; /* Any no
ff20: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 77 6f 72  n-zero value wor
ff30: 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ks */.}../*.** G
ff40: 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74  iven a SELECT st
ff50: 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74  atement, generat
ff60: 65 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74  e a Table struct
ff70: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
ff80: 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  es.** the result
ff90: 20 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c   set of that SEL
ffa0: 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ECT..*/.Table *s
ffb0: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
ffc0: 66 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  fSelect(Parse *p
ffd0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
ffe0: 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65  Select){.  Table
fff0: 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65   *pTab;.  sqlite
10000 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
10010 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46  db;.  int savedF
10020 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c  lags;..  savedFl
10030 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
10040 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
10050 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e  ~SQLITE_FullColN
10060 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  ames;.  db->flag
10070 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
10080 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c  tColNames;.  sql
10090 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
100a0 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
100b0 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  0);.  if( pParse
100c0 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
100d0 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
100e0 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  ect->pPrior ) pS
100f0 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
10100 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66  >pPrior;.  db->f
10110 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67  lags = savedFlag
10120 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  s;.  pTab = sqli
10130 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
10140 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
10150 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  ) );.  if( pTab=
10160 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
10170 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65   0;.  }.  /* The
10180 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
10190 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f  tOfSelect() is o
101a0 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65  nly used n conte
101b0 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73  xts where lookas
101c0 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61  ide.  ** is disa
101d0 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  bled */.  assert
101e0 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
101f0 62 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54  bDisable );.  pT
10200 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
10210 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d  .  pTab->zName =
10220 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77   0;.  pTab->nRow
10230 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73  LogEst = 200; as
10240 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74  sert( 200==sqlit
10250 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36  e3LogEst(1048576
10260 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  ) );.  sqlite3Co
10270 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
10280 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
10290 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
102a0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
102b0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Col);.  sqlite3S
102c0 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
102d0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
102e0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
102f0 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69  lect);.  pTab->i
10300 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28  PKey = -1;.  if(
10310 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
10320 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
10330 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
10340 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72  pTab);.    retur
10350 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
10360 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
10370 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20   Get a VDBE for 
10380 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72  the given parser
10390 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74   context.  Creat
103a0 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
103b0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20  ecessary..** If 
103c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
103d0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
103e0 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65   leave a message
103f0 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56   in pParse..*/.V
10400 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56  dbe *sqlite3GetV
10410 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  dbe(Parse *pPars
10420 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
10430 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 72  ->pVdbe ){.    r
10440 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 70 56  eturn pParse->pV
10450 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dbe;.  }.  if( p
10460 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c  Parse->pToplevel
10470 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69 6d 69  ==0.   && Optimi
10480 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
10490 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f  arse->db,SQLITE_
104a0 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a  FactorOutConst).
104b0 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d    ){.    pParse-
104c0 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d  >okConstFactor =
104d0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
104e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
104f0 74 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a  te(pParse);.}...
10500 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
10510 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
10520 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
10530 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
10540 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
10550 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
10560 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
10570 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
10580 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
10590 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
105a0 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
105b0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
105c0 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
105d0 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
105e0 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
105f0 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
10600 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
10610 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
10620 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
10630 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
10640 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
10650 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
10660 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
10670 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
10680 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
10690 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
106a0 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
106b0 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
106c0 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
106d0 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
106e0 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
106f0 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
10700 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
10710 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
10720 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
10730 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
10740 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
10750 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
10760 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
10770 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
10780 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
10790 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
107a0 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
107b0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
107c0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
107d0 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
107e0 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
107f0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
10800 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
10810 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
10820 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
10830 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
10840 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
10850 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
10860 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
10870 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
10880 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
10890 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
108a0 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
108b0 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
108c0 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
108d0 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
108e0 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
108f0 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
10900 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
10910 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
10920 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
10930 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
10940 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
10950 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
10960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
10970 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
10980 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
10990 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
109a0 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
109b0 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
109c0 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
109d0 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
109e0 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  t n;.  if( p->iL
109f0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
10a00 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
10a10 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
10a20 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
10a30 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
10a40 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
10a50 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
10a60 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
10a70 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
10a80 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
10a90 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
10aa0 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
10ab0 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
10ac0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
10ad0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
10ae0 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
10af0 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
10b00 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
10b10 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
10b20 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
10b30 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
10b40 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
10b50 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
10b60 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
10b70 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30      assert( v!=0
10b80 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
10b90 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
10ba0 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20  (p->pLimit, &n) 
10bb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10bc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10bd0 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
10be0 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
10bf0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
10c00 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
10c10 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
10c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10c30 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
10c40 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
10c50 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
10c60 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
10c70 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
10c80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
10c90 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
10ca0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
10cb0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
10cc0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
10cd0 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
10ce0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10cf0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10d00 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
10d10 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
10d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10d30 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
10d40 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
10d50 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10d60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
10d70 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
10d80 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
10d90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10da0 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
10db0 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
10dc0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10dd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10de0 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
10df0 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
10e00 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
10e10 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10e20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
10e30 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
10e40 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
10e50 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
10e60 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
10e70 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10e80 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
10e90 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
10ea0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10eb0 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
10ec0 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
10ed0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10ee0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10ef0 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
10f00 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
10f10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10f20 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
10f30 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
10f40 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  +1, iOffset);.  
10f50 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
10f60 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
10f70 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T"));.    }.  }.
10f80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10f90 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
10fa0 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
10fb0 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
10fc0 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
10fd0 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
10fe0 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
10ff0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
11000 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
11010 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
11020 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
11030 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
11040 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
11050 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
11060 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
11070 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
11080 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
11090 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
110a0 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
110b0 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
110c0 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
110d0 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
110e0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
110f0 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
11100 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
11110 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
11120 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
11130 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
11140 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
11150 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
11160 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
11170 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
11180 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
11190 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
111a0 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
111b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
111c0 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f  l>=0 );.  /* iCo
111d0 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  l must be less t
111e0 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  han p->pEList->n
111f0 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65  Expr.  Otherwise
11200 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a   an error would.
11210 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74    ** have been t
11220 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d  hrown during nam
11230 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64  e resolution and
11240 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61   we would not ha
11250 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74  ve gotten.  ** t
11260 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28  his far */.  if(
11270 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41   pRet==0 && ALWA
11280 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  YS(iCol<p->pELis
11290 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
112a0 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
112b0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
112c0 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
112d0 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
112e0 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
112f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
11300 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
11310 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
11320 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
11330 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
11340 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
11350 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
11360 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
11370 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
11380 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
11390 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
113a0 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
113b0 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
113c0 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
113d0 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
113e0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
113f0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
11400 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
11410 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
11420 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
11430 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
11440 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
11450 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
11460 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
11470 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
11480 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
11490 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
114a0 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
114b0 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
114c0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
114d0 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
114e0 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
114f0 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
11500 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
11510 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
11520 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
11530 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
11540 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
11550 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
11560 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
11570 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
11580 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
11590 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
115a0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
115b0 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
115c0 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
115d0 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
115e0 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
115f0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11600 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
11610 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
11620 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
11630 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
11640 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
11650 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
11660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11670 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
11680 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
11690 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
116a0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
116b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
116c0 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
116d0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
116e0 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
116f0 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
11700 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11710 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
11720 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
11730 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
11740 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
11750 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11760 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
11770 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
11780 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
11790 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
117a0 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
117b0 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
117c0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
117d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
117e0 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
117f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11800 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
11810 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
11820 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
11830 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
11840 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
11850 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
11860 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
11870 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
11880 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
11890 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
118a0 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
118b0 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
118e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
118f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
11900 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
11920 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
11930 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
11940 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
11950 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
11960 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
11970 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
11980 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
11990 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
119a0 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
119b0 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
119c0 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  a[].fg.isRecursi
119d0 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
119e0 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
119f0 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
11a00 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
11a10 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
11a20 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
11a30 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
11a40 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
11a50 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
11a60 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
11a70 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
11a80 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
11a90 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
11aa0 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
11ab0 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
11ac0 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
11ad0 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
11ae0 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
11af0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
11b00 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
11b10 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
11b20 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
11b30 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
11b40 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
11b50 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
11b60 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
11b70 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
11b80 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
11b90 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
11ba0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
11bb0 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
11bc0 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
11bd0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
11be0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
11bf0 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
11c00 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
11c10 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
11c20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
11c30 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
11c40 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
11c50 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
11c60 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
11c70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
11c80 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
11c90 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
11ca0 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
11cb0 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
11cc0 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
11cd0 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
11ce0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
11cf0 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
11d00 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
11d10 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
11d20 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
11d30 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
11d40 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
11d50 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
11d60 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
11d70 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
11d80 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
11d90 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
11da0 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
11db0 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
11dc0 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
11dd0 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
11de0 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
11df0 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
11e00 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
11e10 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
11e20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
11e30 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
11e40 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
11e50 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
11e60 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
11e70 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
11e80 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
11e90 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
11ea0 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
11eb0 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
11ec0 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
11ed0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
11ee0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
11ef0 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
11f00 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
11f10 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
11f20 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
11f30 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
11f40 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
11f50 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
11f60 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
11f70 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
11f80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
11f90 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
11fa0 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
11fb0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11fc0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11fd0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
11fe0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11ff0 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
12000 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
12010 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
12020 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
12030 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
12040 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
12050 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
12060 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
12070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
12080 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
12090 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
120a0 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
120b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
120c0 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
120d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
120e0 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
120f0 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
12100 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
12110 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
12120 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
12130 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
12140 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
12150 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
12160 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
12170 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
12180 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
12190 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
121a0 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
121b0 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
121c0 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
121d0 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
121e0 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
121f0 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
12200 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12210 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
12220 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
12230 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
12240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
12250 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
12260 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
12270 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12290 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
122a0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
122b0 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
122c0 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
122d0 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
122e0 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
122f0 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
12300 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
12310 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
12320 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
12330 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
12340 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
12350 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
12360 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
12370 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
123a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
123d0 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
123e0 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
123f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12400 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
12410 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
12420 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20  t, *pOffset;    
12430 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
12440 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
12450 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
12460 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
12470 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
12480 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
12490 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  FFSET */..  /* O
124a0 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74  btain authorizat
124b0 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75  ion to do a recu
124c0 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
124d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
124e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
124f0 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20  LITE_RECURSIVE, 
12500 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
12510 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  n;..  /* Process
12520 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
12530 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69  FFSET clauses, i
12540 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a  f they exist */.
12550 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
12560 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
12570 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
12580 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
12590 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
125a0 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
125b0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
125c0 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
125d0 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
125e0 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
125f0 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
12600 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
12610 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
12620 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
12630 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
12640 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
12650 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
12660 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
12670 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
12680 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
12690 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
126a0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
126b0 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
126c0 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
126d0 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
126e0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
126f0 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
12700 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
12710 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
12720 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
12730 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12740 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
12750 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
12760 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
12770 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
12780 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
12790 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
127a0 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
127b0 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
127c0 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
127d0 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
127e0 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
127f0 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
12800 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
12810 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
12820 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
12830 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
12840 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
12850 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
12860 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
12870 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
12880 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
12890 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
128a0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
128b0 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
128c0 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
128d0 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
128e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
128f0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
12900 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
12910 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
12920 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
12930 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
12940 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
12950 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
12960 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
12970 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
12980 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
12990 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
129a0 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
129b0 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
129c0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
129d0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
129e0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
129f0 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
12a00 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
12a10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12a20 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12a30 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
12a40 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
12a50 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
12a60 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
12a70 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
12a80 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
12a90 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
12aa0 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
12ab0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
12ac0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12ad0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12ae0 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
12af0 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
12b00 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
12b10 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
12b20 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
12b30 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
12b40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b50 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
12b60 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
12b70 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
12b80 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
12b90 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
12ba0 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
12bb0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12bc0 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
12bd0 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
12be0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
12bf0 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
12c00 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
12c10 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
12c20 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
12c30 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72  ->pNext = 0;.  r
12c40 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
12c50 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
12c60 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
12c70 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
12c80 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
12c90 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
12ca0 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
12cb0 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
12cc0 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
12cd0 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
12ce0 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
12cf0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
12d00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
12d10 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
12d20 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
12d30 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
12d40 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
12d50 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
12d60 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
12d70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12d80 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
12d90 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
12da0 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
12db0 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
12dc0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12dd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12de0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
12df0 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
12e00 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
12e10 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
12e20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12e30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
12e40 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
12e50 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
12e60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e70 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
12e80 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
12e90 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
12ea0 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
12eb0 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
12ec0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12ed0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64  eLabel(v);.  cod
12ee0 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66  eOffset(v, regOf
12ef0 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b  fset, addrCont);
12f00 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
12f10 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 69 43  op(pParse, p, iC
12f20 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c  urrent,.      0,
12f30 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43   0, pDest, addrC
12f40 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  ont, addrBreak);
12f50 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20  .  if( regLimit 
12f60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12f70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
12f80 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67  ecrJumpZero, reg
12f90 4c 69 6d 69 74 2c 20 61 64 64 72 42 72 65 61 6b  Limit, addrBreak
12fa0 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72  );.    VdbeCover
12fb0 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
12fc0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12fd0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
12fe0 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74  t);..  /* Execut
12ff0 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  e the recursive 
13000 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68  SELECT taking th
13010 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
13020 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20  Current as.  ** 
13030 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
13040 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
13050 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  e. Store the res
13060 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75  ults in the Queu
13070 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
13080 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
13090 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20 20  ggregate ){.    
130a0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
130b0 70 50 61 72 73 65 2c 20 22 72 65 63 75 72 73 69  pParse, "recursi
130c0 76 65 20 61 67 67 72 65 67 61 74 65 20 71 75 65  ve aggregate que
130d0 72 69 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  ries not support
130e0 65 64 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ed");.  }else{. 
130f0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
13100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
13110 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
13120 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20  destQueue);.    
13130 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
13140 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  r==0 );.    p->p
13150 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a  Prior = pSetup;.
13160 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72    }..  /* Keep r
13170 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20  unning the loop 
13180 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
13190 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71  is empty */.  sq
131a0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
131b0 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
131c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
131d0 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
131e0 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75  k);..end_of_recu
131f0 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73  rsive_query:.  s
13200 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
13210 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
13220 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
13230 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
13240 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c  OrderBy;.  p->pL
13250 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
13260 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
13270 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b  ffset;.  return;
13280 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13290 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
132a0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
132b0 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63  rences */.static
132c0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
132d0 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
132e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
132f0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13300 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
13310 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13320 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
13330 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
13340 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
13350 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
13360 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
13370 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
13380 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a  lts */.);../*.**
13390 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65 63   Handle the spec
133a0 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63 6f  ial case of a co
133b0 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68  mpound-select th
133c0 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  at originates fr
133d0 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63  om a.** VALUES c
133e0 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64 6c  lause.  By handl
133f0 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73 70  ing this as a sp
13400 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20 61  ecial case, we a
13410 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65 63  void deep.** rec
13420 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73  ursion, and thus
13430 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
13440 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c 49  enforce the SQLI
13450 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
13460 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61  D_SELECT.** on a
13470 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
13480 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74 68  **.** Because th
13490 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  e Select object 
134a0 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
134b0 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 3a  a VALUES clause:
134c0 0a 2a 2a 20 20 20 28 31 29 20 49 74 20 68 61 73  .**   (1) It has
134d0 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46   no LIMIT or OFF
134e0 53 45 54 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c  SET.**   (2) All
134f0 20 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e   terms are UNION
13500 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68   ALL.**   (3) Th
13510 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
13520 42 59 20 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61  BY clause.*/.sta
13530 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
13540 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50 61 72  ectValues(.  Par
13550 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13560 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
13570 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
13580 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
13590 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
135a0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
135b0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
135c0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
135d0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
135e0 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
135f0 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65  sults */.){.  Se
13600 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20  lect *pPrior;.  
13610 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20  int nRow = 1;.  
13620 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73  int rc = 0;.  as
13630 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
13640 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
13650 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61  e );.  do{.    a
13660 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
13670 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
13680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
13690 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28  >op==TK_ALL || (
136a0 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  p->op==TK_SELECT
136b0 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30   && p->pPrior==0
136c0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
136d0 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b   p->pLimit==0 );
136e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
136f0 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  pOffset==0 );.  
13700 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
13710 78 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69  xt==0 || p->pELi
13720 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e  st->nExpr==p->pN
13730 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ext->pEList->nEx
13740 70 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  pr );.    if( p-
13750 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 62 72 65  >pPrior==0 ) bre
13760 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
13770 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  p->pPrior->pNext
13780 3d 3d 70 20 29 3b 0a 20 20 20 20 70 20 3d 20 70  ==p );.    p = p
13790 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52  ->pPrior;.    nR
137a0 6f 77 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31  ow++;.  }while(1
137b0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
137c0 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 2d  .    pPrior = p-
137d0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e  >pPrior;.    p->
137e0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
137f0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
13800 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
13810 65 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72  est);.    p->pPr
13820 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
13830 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
13840 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
13850 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  Row = nRow;.    
13860 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
13870 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13880 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
13890 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
138a0 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70  o process a comp
138b0 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20  ound query form 
138c0 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d  from.** two or m
138d0 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65  ore separate que
138e0 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e  ries using UNION
138f0 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43  , UNION ALL, EXC
13900 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52  EPT, or.** INTER
13910 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70  SECT.**.** "p" p
13920 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67  oints to the rig
13930 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74  ht-most of the t
13940 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65  wo queries.  the
13950 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a   query on the.**
13960 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69   left is p->pPri
13970 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75  or.  The left qu
13980 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62  ery could also b
13990 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
139a0 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63  ry.** in which c
139b0 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
139c0 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
139d0 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a  recursively. .**
139e0 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
139f0 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  of the total que
13a00 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69  ry are to be wri
13a10 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74  tten into a dest
13a20 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79  ination.** of ty
13a30 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61  pe eDest with pa
13a40 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a  rameter iParm..*
13a50 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20  *.** Example 1: 
13a60 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65   Consider a thre
13a70 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53  e-way compound S
13a80 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
13a90 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61  .**     SELECT a
13aa0 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53   FROM t1 UNION S
13ab0 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20  ELECT b FROM t2 
13ac0 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46  UNION SELECT c F
13ad0 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69  ROM t3.**.** Thi
13ae0 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  s statement is p
13af0 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c  arsed up as foll
13b00 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ows:.**.**     S
13b10 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
13b20 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20  **      |.**    
13b30 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43    `----->  SELEC
13b40 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20  T b FROM t2.**  
13b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
13b60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
13b70 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45    `------>  SELE
13b80 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a  CT a FROM t1.**.
13b90 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e  ** The arrows in
13ba0 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f   the diagram abo
13bb0 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ve represent the
13bc0 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70   Select.pPrior p
13bd0 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66  ointer..** So if
13be0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13bf0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65   called with p e
13c00 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71  qual to the t3 q
13c10 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50  uery, then.** pP
13c20 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65  rior will be the
13c30 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f   t2 query.  p->o
13c40 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49  p will be TK_UNI
13c50 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ON in this case.
13c60 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68  .**.** Notice th
13c70 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  at because of th
13c80 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72  e way SQLite par
13c90 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  ses compound SEL
13ca0 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64  ECTs, the.** ind
13cb0 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20  ividual selects 
13cc0 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f  always group fro
13cd0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e  m left to right.
13ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
13cf0 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61  ultiSelect(.  Pa
13d00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
13d10 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
13d20 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
13d30 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
13d40 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
13d50 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
13d60 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
13d70 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
13d80 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
13d90 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
13da0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
13db0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13dc0 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20  K;   /* Success 
13dd0 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72  code from a subr
13de0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65  outine */.  Sele
13df0 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20  ct *pPrior;     
13e00 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c    /* Another SEL
13e10 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ECT immediately 
13e20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20  to our left */. 
13e30 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
13e40 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
13e50 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20  te code to this 
13e60 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74  VDBE */.  Select
13e70 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20  Dest dest;      
13e80 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  /* Alternative d
13e90 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ata destination 
13ea0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65  */.  Select *pDe
13eb0 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68  lete = 0;  /* Ch
13ec0 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65  ain of simple se
13ed0 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20  lects to delete 
13ee0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
13ef0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
13f00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13f10 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  n */.#ifndef SQL
13f20 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
13f30 0a 20 20 69 6e 74 20 69 53 75 62 31 20 3d 20 30  .  int iSub1 = 0
13f40 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
13f50 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
13f60 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
13f70 53 75 62 32 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub2 = 0;       
13f80 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
13f90 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
13fa0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d  /.#endif..  /* M
13fb0 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
13fc0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
13fd0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e   LIMIT clause on
13fe0 20 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20   prior SELECTs. 
13ff0 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c   Only.  ** the l
14000 61 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29  ast (right-most)
14010 20 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73   SELECT in the s
14020 65 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61  eries may have a
14030 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  n ORDER BY or LI
14040 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  MIT..  */.  asse
14050 72 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69  rt( p && p->pPri
14060 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e  or );  /* Callin
14070 67 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61  g function guara
14080 6e 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20  ntees this much 
14090 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  */.  assert( (p-
140a0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
140b0 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20  ecursive)==0 || 
140c0 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  p->op==TK_ALL ||
140d0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
140e0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
140f0 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20  e->db;.  pPrior 
14100 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  = p->pPrior;.  d
14110 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20  est = *pDest;.  
14120 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
14130 65 72 42 79 20 7c 7c 20 70 50 72 69 6f 72 2d 3e  erBy || pPrior->
14140 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
14150 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14160 61 72 73 65 2c 22 25 73 20 63 6c 61 75 73 65 20  arse,"%s clause 
14170 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
14180 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
14190 2c 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ,.      pPrior->
141a0 70 4f 72 64 65 72 42 79 21 3d 30 20 3f 20 22 4f  pOrderBy!=0 ? "O
141b0 52 44 45 52 20 42 59 22 20 3a 20 22 4c 49 4d 49  RDER BY" : "LIMI
141c0 54 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  T", selectOpName
141d0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
141e0 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
141f0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
14200 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69  .  }..  v = sqli
14210 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
14220 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
14230 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44  =0 );  /* The VD
14240 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74  BE already creat
14250 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75  ed by calling fu
14260 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  nction */..  /* 
14270 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69  Create the desti
14280 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79  nation temporary
14290 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73   table if necess
142a0 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ary.  */.  if( d
142b0 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45  est.eDest==SRT_E
142c0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61  phemTab ){.    a
142d0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
142e0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
142f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14300 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64  OpenEphemeral, d
14310 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e  est.iSDParm, p->
14320 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
14330 20 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d      dest.eDest =
14340 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a   SRT_Table;.  }.
14350 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61  .  /* Special ha
14360 6e 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d  ndling for a com
14370 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61  pound-select tha
14380 74 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20  t originates as 
14390 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
143a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
143b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
143c0 74 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72  tiValue ){.    r
143d0 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56  c = multiSelectV
143e0 61 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c  alues(pParse, p,
143f0 20 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74   &dest);.    got
14400 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
14410 6e 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  nd;.  }..  /* Ma
14420 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45  ke sure all SELE
14430 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  CTs in the state
14440 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61  ment have the sa
14450 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  me number of ele
14460 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68  ments.  ** in th
14470 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e  eir result sets.
14480 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
14490 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72  p->pEList && pPr
144a0 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ior->pEList );. 
144b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
144c0 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f  st->nExpr==pPrio
144d0 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
144e0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
144f0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69  ITE_OMIT_CTE.  i
14500 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
14510 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
14520 0a 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74  .    generateWit
14530 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
14540 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
14550 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
14560 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64  f..  /* Compound
14570 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61   SELECTs that ha
14580 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ve an ORDER BY c
14590 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65  lause are handle
145a0 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20  d separately..  
145b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  */.  if( p->pOrd
145c0 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75  erBy ){.    retu
145d0 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  rn multiSelectOr
145e0 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c  derBy(pParse, p,
145f0 20 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   pDest);.  }else
14600 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14610 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66  code for the lef
14620 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45  t and right SELE
14630 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
14640 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d   */.  switch( p-
14650 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
14660 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  TK_ALL: {.      
14670 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20  int addr = 0;.  
14680 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a      int nLimit;.
14690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
146a0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
146b0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
146c0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
146d0 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  t;.      pPrior-
146e0 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  >iOffset = p->iO
146f0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72  ffset;.      pPr
14700 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d  ior->pLimit = p-
14710 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14720 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d  Prior->pOffset =
14730 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
14740 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
14750 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
14760 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
14770 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
14780 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
14790 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
147a0 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  st);.      p->pL
147b0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
147c0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
147d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
147e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
147f0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
14800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
14810 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
14820 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50    p->iLimit = pP
14830 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20  rior->iLimit;.  
14840 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
14850 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
14860 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  ;.      if( p->i
14870 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
14880 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
14890 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
148a0 49 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74  IfNot, p->iLimit
148b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
148c0 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  v);.        Vdbe
148d0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
148e0 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
148f0 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
14900 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66       if( p->iOff
14910 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
14920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14930 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c  p3(v, OP_OffsetL
14940 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
14950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14960 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e    p->iLimit, p->
14970 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f  iOffset+1, p->iO
14980 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
14990 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
149a0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
149b0 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
149c0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
149d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
149e0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
149f0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
14a00 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14a20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
14a30 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
14a40 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
14a50 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  r;.      p->nSel
14a60 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
14a70 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
14a80 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
14a90 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
14aa0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
14ab0 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26  pLimit.       &&
14ac0 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
14ad0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
14ae0 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  imit, &nLimit). 
14af0 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e        && nLimit>
14b00 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
14b10 6f 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow > sqlite3LogE
14b20 73 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20  st((u64)nLimit) 
14b30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
14b40 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
14b50 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
14b60 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20  (u64)nLimit);.  
14b70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14b80 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  addr ){.        
14b90 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
14ba0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
14bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
14bc0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
14bd0 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
14be0 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20   case TK_UNION: 
14bf0 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f  {.      int unio
14c00 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73  nTab;    /* Curs
14c10 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
14c20 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
14c30 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20   holding result 
14c40 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d  */.      u8 op =
14c50 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65   0;       /* One
14c60 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65   of the SRT_ ope
14c70 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79  rations to apply
14c80 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   to self */.    
14c90 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20    int priorOp;  
14ca0 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f     /* The SRT_ o
14cb0 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c  peration to appl
14cc0 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63  y to prior selec
14cd0 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  ts */.      Expr
14ce0 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73   *pLimit, *pOffs
14cf0 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  et; /* Saved val
14d00 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74  ues of p->nLimit
14d10 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20   and p->nOffset 
14d20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
14d30 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
14d40 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a  est uniondest;..
14d50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14d60 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
14d70 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
14d80 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  se( p->op==TK_UN
14d90 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ION );.      pri
14da0 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e  orOp = SRT_Union
14db0 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74  ;.      if( dest
14dc0 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20  .eDest==priorOp 
14dd0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
14de0 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
14df0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
14e00 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
14e10 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
14e20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20    ** right..    
14e30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
14e40 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
14e50 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
14e60 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65  ot allowed on le
14e70 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20  ftward elements 
14e80 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
14e90 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
14ea0 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61   );     /* Not a
14eb0 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
14ec0 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
14ed0 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
14ee0 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a  = dest.iSDParm;.
14ef0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14f00 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
14f10 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
14f20 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
14f30 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
14f40 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  he.        ** in
14f50 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
14f60 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ts..        */. 
14f70 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20         unionTab 
14f80 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14f90 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
14fa0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ( p->pOrderBy==0
14fb0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72   );.        addr
14fc0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
14fd0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
14fe0 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54  phemeral, unionT
14ff0 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ab, 0);.        
15000 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f  assert( p->addrO
15010 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31  penEphm[0] == -1
15020 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   );.        p->a
15030 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
15040 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66   addr;.        f
15050 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
15060 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
15070 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
15080 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15090 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
150a0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
150b0 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
150c0 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
150d0 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
150e0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
150f0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
15100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15110 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
15120 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
15130 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
15140 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
15150 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
15160 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
15170 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
15180 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
15190 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
151a0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
151b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
151c0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
151d0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
151e0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
151f0 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
15200 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
15210 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
15220 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
15230 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
15240 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
15250 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15260 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
15270 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
15280 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
15290 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
152a0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
152b0 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
152c0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
152d0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
152e0 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
152f0 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
15300 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
15310 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
15320 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
15330 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15340 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
15350 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15360 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15370 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15380 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
15390 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
153a0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
153b0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
153c0 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
153d0 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
153e0 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
153f0 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
15400 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
15410 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
15420 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
15430 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
15440 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
15450 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
15460 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
15470 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
15480 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
15490 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
154a0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
154b0 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
154c0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
154d0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
154e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
154f0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
15500 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e  te3LogEstAdd(p->
15510 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69  nSelectRow, pPri
15520 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b  or->nSelectRow);
15530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15540 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
15550 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
15560 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
15570 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
15580 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
15590 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
155a0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
155b0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
155c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
155d0 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
155e0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
155f0 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
15600 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
15610 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
15620 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
15630 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
15640 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
15650 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
15660 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
15670 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
15680 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
15690 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
156a0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
156b0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
156c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
156d0 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
156e0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
156f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15700 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d  .        iCont =
15710 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15720 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
15730 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
15740 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
15750 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
15760 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15770 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
15780 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42  nd, unionTab, iB
15790 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
157a0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
157b0 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
157c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
157d0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  v);.        sele
157e0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
157f0 73 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c  se, p, unionTab,
15800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15810 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
15820 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
15830 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
15840 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
15850 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
15860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15870 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15880 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
15890 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
158a0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
158b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
158c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
158d0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
158e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
158f0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
15900 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
15910 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
15920 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
15930 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  lt: assert( p->o
15940 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
15950 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ); {.      int t
15960 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
15970 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
15980 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
15990 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
159a0 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
159b0 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
159c0 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
159d0 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
159e0 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
159f0 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
15a00 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
15a10 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
15a20 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
15a30 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
15a40 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
15a50 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
15a60 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
15a70 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
15a80 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
15a90 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
15aa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
15ab0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
15ac0 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
15ad0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
15ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15af0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
15b00 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
15b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15b20 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
15b30 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
15b40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15b50 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
15b60 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
15b70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
15b80 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
15b90 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
15ba0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
15bb0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
15bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15bd0 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20  >pEList );..    
15be0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
15bf0 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
15c00 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
15c10 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
15c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
15c30 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
15c40 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65  nit(&intersectde
15c50 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74  st, SRT_Union, t
15c60 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  ab1);.      expl
15c70 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
15c80 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
15c90 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
15ca0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
15cb0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
15cc0 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74  rior, &intersect
15cd0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
15ce0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
15cf0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
15d00 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
15d10 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
15d20 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
15d30 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74  into temporary t
15d40 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20  able "tab2".    
15d50 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20    */.      addr 
15d60 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15d70 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
15d80 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30  hemeral, tab2, 0
15d90 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
15da0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
15db0 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [1] == -1 );.   
15dc0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
15dd0 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[1] = addr;.  
15de0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
15df0 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
15e00 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
15e10 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
15e20 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
15e30 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
15e40 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
15e50 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73   0;.      inters
15e60 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20  ectdest.iSDParm 
15e70 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78  = tab2;.      ex
15e80 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
15e90 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
15ea0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
15eb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15ec0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
15ed0 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
15ee0 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
15ef0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
15f00 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65  K );.      pDele
15f10 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
15f20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
15f30 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
15f40 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
15f50 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  w>pPrior->nSelec
15f60 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63  tRow ) p->nSelec
15f70 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e  tRow = pPrior->n
15f80 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
15f90 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
15fa0 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
15fb0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
15fc0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
15fd0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
15fe0 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20  pOffset;..      
15ff0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
16000 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74   to take the int
16010 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  ersection of the
16020 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20   two temporary. 
16030 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a       ** tables..
16040 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
16050 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
16060 20 29 3b 0a 20 20 20 20 20 20 69 42 72 65 61 6b   );.      iBreak
16070 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16080 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16090 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
160a0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
160b0 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65  );.      compute
160c0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
160d0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
160e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
160f0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16100 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
16110 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
16120 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72  rage(v);.      r
16130 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
16140 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16150 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
16160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16170 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74  v, OP_RowData, t
16180 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ab1, r1);.      
16190 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
161a0 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f  4Int(v, OP_NotFo
161b0 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74  und, tab2, iCont
161c0 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f  , r1, 0); VdbeCo
161d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
161e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
161f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16200 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
16210 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
16220 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  , p, tab1,.     
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
16250 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
16260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
16270 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
16280 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
16290 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
162a0 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
162b0 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
162c0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
162d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
162e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
162f0 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
16300 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16310 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
16320 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
16330 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16340 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
16350 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16360 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70      }.  }..  exp
16370 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
16380 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
16390 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70  b1, iSub2, p->op
163a0 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a  !=TK_ALL);..  /*
163b0 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
163c0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
163d0 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  d by .  ** tempo
163e0 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
163f0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
16400 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
16410 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
16420 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
16430 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
16440 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
16450 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
16460 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
16470 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
16480 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16490 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
164a0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
164b0 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
164c0 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
164d0 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
164e0 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
164f0 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
16500 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
16510 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
16520 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
16530 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
16540 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
16550 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
16560 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65   & SF_UsesEpheme
16570 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ral ){.    int i
16580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16590 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
165a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
165b0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
165c0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
165d0 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
165e0 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
165f0 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
16600 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
16610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16620 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
16630 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
16640 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
16650 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
16660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
16670 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
16680 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
16690 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
166a0 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
166b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
166c0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
166d0 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
166e0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
166f0 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43  ext==0 );.    nC
16700 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
16710 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
16720 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
16730 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43  InfoAlloc(db, nC
16740 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ol, 1);.    if( 
16750 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
16760 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16770 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
16780 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16790 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
167a0 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
167b0 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
167c0 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
167d0 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
167e0 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
167f0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
16800 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
16810 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
16820 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
16830 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
16840 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
16850 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
16860 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
16870 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
16880 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
16890 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
168a0 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
168b0 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
168c0 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
168d0 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
168e0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
168f0 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
16900 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
16910 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
16920 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
16930 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
16940 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
16950 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
16960 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
16970 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16980 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
16990 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
169a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
169b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
169c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
169d0 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
169e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
169f0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
16a00 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73  , addr, (char*)s
16a10 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
16a20 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20  (pKeyInfo),.    
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a40 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
16a50 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
16a60 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
16a70 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
16a80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
16a90 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
16aa0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
16ab0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
16ac0 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74  :.  pDest->iSdst
16ad0 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
16ae0 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
16af0 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71  dest.nSdst;.  sq
16b00 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
16b10 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
16b20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
16b30 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16b40 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
16b50 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  LECT */../*.** E
16b60 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
16b70 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72   when two or mor
16b80 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d  e terms of a com
16b90 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76  pound select hav
16ba0 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73  e different.** s
16bb0 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e  ize result sets.
16bc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16bd0 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  SelectWrongNumTe
16be0 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a  rmsError(Parse *
16bf0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
16c00 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  p){.  if( p->sel
16c10 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
16c20 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
16c30 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16c40 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
16c50 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
16c60 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
16c70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16c80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16c90 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
16ca0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
16cb0 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
16cc0 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
16cd0 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16ce0 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
16cf0 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
16d00 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
16d10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
16d20 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
16d30 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
16d40 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
16d50 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
16d60 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
16d70 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
16d80 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
16d90 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
16da0 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
16db0 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
16dc0 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
16dd0 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
16de0 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
16df0 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
16e00 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
16e10 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
16e20 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
16e30 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
16e40 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
16e50 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
16e60 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
16e70 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
16e80 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
16e90 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
16ea0 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
16eb0 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
16ec0 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
16ed0 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
16ee0 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
16ef0 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
16f00 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
16f10 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
16f20 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
16f30 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
16f40 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
16f50 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
16f60 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
16f70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
16f80 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
16f90 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
16fa0 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
16fb0 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
16fc0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
16fd0 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
16fe0 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
16ff0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
17000 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
17010 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
17020 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
17030 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
17040 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
17050 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
17060 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
17070 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
17080 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
17090 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
170a0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
170b0 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
170c0 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
170d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
170e0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
170f0 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
17100 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
17110 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
17120 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
17130 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
17140 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
17150 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
17160 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
17170 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
17180 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
17190 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
171a0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
171b0 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
171c0 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
171d0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
171e0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
171f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
17200 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
17210 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
17220 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
17230 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
17240 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17250 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
17260 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
17270 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
17280 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
17290 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
172a0 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
172b0 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64  , addr2;.    add
172c0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
172d0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
172e0 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
172f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
17300 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
17310 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17320 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
17330 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
17340 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20  1, pIn->nSdst,. 
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
17370 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
17380 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
17390 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
173a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
173b0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
173c0 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  addr2+2, iContin
173d0 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64  ue, addr2+2); Vd
173e0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
173f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17400 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
17410 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17420 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
17430 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
17440 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
17450 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
17460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17470 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
17480 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
17490 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
174a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
174b0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
174c0 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
174d0 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
174e0 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
174f0 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
17500 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
17510 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
17520 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
17530 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
17540 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
17550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
17560 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
17570 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63  Table );.  switc
17580 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
17590 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
175a0 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
175b0 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
175c0 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
175d0 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
175e0 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
175f0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
17600 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
17610 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
17620 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17630 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17650 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
17660 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
17670 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
17680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17690 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
176a0 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
176b0 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
176c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
176d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
176e0 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
176f0 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
17700 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
17710 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
17720 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
17730 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17740 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
17750 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
17760 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17770 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
17780 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
177a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
177b0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
177c0 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
177d0 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
177e0 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20  ELECT ...)"..   
177f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17800 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
17810 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74  t r1;.      test
17820 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
17830 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  >1 );.      r1 =
17840 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
17850 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
17860 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17870 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
17880 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
17890 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20  , pIn->nSdst, . 
178a0 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65           r1, pDe
178b0 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49  st->zAffSdst, pI
178c0 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
178d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
178e0 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
178f0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17900 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
17910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17920 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
17930 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
17940 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
17950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17960 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d              pIn-
17970 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17980 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
17990 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
179a0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
179b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
179c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
179d0 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
179e0 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
179f0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
17a00 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
17a10 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
17a20 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
17a30 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
17a40 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
17a50 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
17a60 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
17a70 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
17a80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17a90 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c  pIn->nSdst==1 ||
17aa0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
17ab0 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49  );  testcase( pI
17ac0 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20  n->nSdst!=1 );. 
17ad0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17ae0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
17af0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
17b00 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
17b10 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
17b20 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
17b30 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
17b40 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
17b50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17b60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
17b70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17b80 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
17b90 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
17ba0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
17bb0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
17bc0 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
17bd0 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
17be0 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
17bf0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
17c00 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
17c10 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
17c20 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
17c30 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
17c40 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
17c50 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
17c60 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
17c70 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
17c80 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
17c90 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
17ca0 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
17cb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17cc0 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
17cd0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
17ce0 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17cf0 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
17d00 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
17d10 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
17d20 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
17d30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
17d40 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
17d50 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
17d60 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
17d70 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
17d80 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
17d90 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
17da0 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
17db0 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
17dc0 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
17dd0 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
17de0 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
17df0 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
17e00 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
17e10 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
17e20 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
17e30 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
17e40 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
17e50 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
17e60 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
17e70 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
17e80 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
17e90 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
17ea0 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
17eb0 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
17ec0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
17ed0 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
17ee0 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
17ef0 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
17f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17f10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17f20 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
17f30 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17f40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17f50 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
17f60 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
17f70 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
17f80 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
17f90 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17fa0 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
17fb0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
17fc0 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
17fd0 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
17fe0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
17ff0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
18000 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
18010 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e  ecrJumpZero, p->
18020 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
18030 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
18040 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
18050 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
18060 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  ine return.  */.
18070 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18080 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
18090 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
180a0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
180b0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
180c0 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e  turn);..  return
180d0 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
180e0 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70  Alternative comp
180f0 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65  ound select code
18100 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63   generator for c
18110 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a  ases when there.
18120 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  ** is an ORDER B
18130 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
18140 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72  We assume a quer
18150 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
18160 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
18170 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c      <selectA>  <
18180 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65  operator>  <sele
18190 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c  ctB>  ORDER BY <
181a0 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a  orderbylist>.**.
181b0 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
181c0 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c   one of UNION AL
181d0 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  L, UNION, EXCEPT
181e0 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20  , or INTERSECT. 
181f0 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20   The idea.** is 
18200 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65  to code both <se
18210 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65  lectA> and <sele
18220 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52  ctB> with the OR
18230 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
18240 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e  .** co-routines.
18250 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63    Then run the c
18260 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61  o-routines in pa
18270 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65  rallel and merge
18280 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
18290 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
182a0 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
182b0 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
182c0 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65  nes (called sele
182d0 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63  ctA and.** selec
182e0 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20  tB) there are 7 
182f0 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a  subroutines:.**.
18300 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d  **    outA:    M
18310 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
18320 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f  f the selectA co
18330 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
18340 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
18350 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
18360 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
18370 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20  .**    outB:    
18380 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
18390 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63  of the selectB c
183a0 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
183b0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
183c0 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
183d0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20  ompound query.  
183e0 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20  (Only generated 
183f0 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a  for UNION and.**
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
18410 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20  ON ALL.  EXCEPT 
18420 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e  and INSERTSECT n
18430 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f  ever output a ro
18440 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  w that.**       
18450 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e        appears on
18460 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20  ly in B.).**.** 
18470 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c     AltB:    Call
18480 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
18490 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
184a0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
184b0 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71  <B..**.**    Aeq
184c0 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
184d0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
184e0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
184f0 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a  ines and A==B..*
18500 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20  *.**    AgtB:   
18510 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
18520 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
18530 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
18540 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A>B..**.**  
18550 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65    EofA:    Calle
18560 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
18570 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
18580 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lectA..**.**    
18590 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofB:    Called 
185a0 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
185b0 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
185c0 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ctB..**.** The i
185d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
185e0 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65   the latter five
185f0 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70   subroutines dep
18600 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a  end on which .**
18610 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75   <operator> is u
18620 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  sed:.**.**.**   
18630 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
18640 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f  ALL         UNIO
18650 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43  N            EXC
18660 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54  EPT          INT
18670 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  ERSECT.**       
18680 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
18690 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
186a0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
186b0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
186c0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42  ------.**   AltB
186d0 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
186e0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
186f0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
18700 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
18710 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20  .**.**   AeqB:  
18720 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
18730 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
18740 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
18750 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
18760 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20  .**.**   AgtB:  
18770 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
18780 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
18790 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20         nextB    
187a0 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
187b0 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
187c0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
187d0 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
187e0 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
187f0 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
18800 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20    EofB:   outA, 
18810 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
18820 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
18830 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
18840 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   halt.**.** In t
18850 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61  he AltB, AeqB, a
18860 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69  nd AgtB subrouti
18870 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41  nes, an EOF on A
18880 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41   following nextA
18890 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d  .** causes an im
188a0 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
188b0 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20  EofA and an EOF 
188c0 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on B following n
188d0 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61  extB causes.** a
188e0 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
188f0 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69   to EofB.  Withi
18900 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c  n EofA and EofB,
18910 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72   and EOF on entr
18920 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  y or.** followin
18930 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61  g nextX causes a
18940 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   jump to the end
18950 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70   of the select p
18960 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
18970 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   Duplicate remov
18980 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c  al in the UNION,
18990 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
189a0 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20  ERSECT cases is 
189b0 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69  handled.** withi
189c0 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  n the output sub
189d0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65  routine.  The re
189e0 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73  gPrev register s
189f0 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65  et holds the pre
18a00 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75  viously.** outpu
18a10 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70  t value.  A comp
18a20 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61  arison is made a
18a30 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75  gainst this valu
18a40 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  e and the output
18a50 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69  .** is skipped i
18a60 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  f the next resul
18a70 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20  ts would be the 
18a80 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76  same as the prev
18a90 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ious..**.** The 
18aa0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
18ab0 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d  lan is to implem
18ac0 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f  ent the two coro
18ad0 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e  utines and seven
18ae0 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20  .** subroutines 
18af0 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20  first, then put 
18b00 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69  the control logi
18b10 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e  c at the bottom.
18b20 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
18b30 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  **          goto
18b40 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41   Init.**     coA
18b50 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
18b60 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a  left query (A).*
18b70 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75  *     coB: corou
18b80 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71  tine for right q
18b90 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f  uery (B).**    o
18ba0 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utA: output one 
18bb0 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f  row of A.**    o
18bc0 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utB: output one 
18bd0 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20  row of B (UNION 
18be0 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e  and UNION ALL on
18bf0 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  ly).**    EofA: 
18c00 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  ....**    EofB: 
18c10 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  ....**    AltB: 
18c20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  ....**    AeqB: 
18c30 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  ....**    AgtB: 
18c40 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20  ....**    Init: 
18c50 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75  initialize corou
18c60 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tine registers.*
18c70 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
18c80 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20   coA.**         
18c90 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20   if eof(A) goto 
18ca0 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  EofA.**         
18cb0 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20   yield coB.**   
18cc0 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29         if eof(B)
18cd0 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20   goto EofB.**   
18ce0 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41   Cmpr: Compare A
18cf0 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  , B.**          
18d00 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c  Jump AltB, AeqB,
18d10 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64   AgtB.**     End
18d20 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63  : ....**.** We c
18d30 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  all AltB, AeqB, 
18d40 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20  AgtB, EofA, and 
18d50 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65  EofB "subroutine
18d60 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20  s" but they are 
18d70 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  not.** actually 
18d80 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73  called using Gos
18d90 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e  ub and they do n
18da0 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41  ot Return.  EofA
18db0 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a   and EofB loop.*
18dc0 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61  * until all data
18dd0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68   is exhausted th
18de0 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22  en jump to the "
18df0 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42  end" labe.  AltB
18e00 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41  , AeqB,.** and A
18e10 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68  gtB jump to eith
18e20 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20  er L2 or to one 
18e30 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e  of EofA or EofB.
18e40 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
18e50 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
18e60 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69  _SELECT.static i
18e70 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
18e80 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
18e90 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
18ea0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
18eb0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
18ec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18ed0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
18ee0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
18ef0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
18f00 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
18f10 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
18f20 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
18f30 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
18f40 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
18f50 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
18f60 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
18f70 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
18f80 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
18f90 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
18fa0 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
18fb0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
18fc0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
18fd0 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
18fe0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
18ff0 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
19000 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
19010 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
19020 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
19030 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
19040 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
19050 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
19060 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
19070 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
19080 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
19090 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
190a0 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
190b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
190c0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
190d0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
190e0 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
190f0 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
19100 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
19110 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
19120 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
19130 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
19140 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
19150 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
19160 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
19170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
19180 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
19190 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
191a0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
191b0 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
191c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
191d0 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
191e0 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
191f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19200 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
19210 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19220 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
19230 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19240 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20  ddrOutB = 0;    
19250 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19260 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
19270 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
19280 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
19290 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
192a0 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
192b0 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
192c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
192d0 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20  ofA_noB;     /* 
192e0 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f  Alternate addrEo
192f0 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69  fA if B is unini
19300 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e  tialized */.  in
19310 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
19320 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19330 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
19340 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
19350 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
19360 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
19370 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
19380 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
19390 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
193a0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
193b0 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
193c0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
193d0 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
193e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
193f0 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
19400 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
19410 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
19420 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
19430 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
19440 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
19450 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
19460 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
19470 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
19480 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
19490 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
194a0 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
194b0 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
194c0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
194d0 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
194e0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
194f0 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
19500 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
19510 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
19520 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
19530 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
19540 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
19550 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
19560 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
19570 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
19580 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
19590 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
195a0 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
195b0 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
195c0 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
195d0 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
195e0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
195f0 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
19600 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
19610 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
19620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
19630 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
19640 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
19650 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
19660 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
19670 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d  yDup = 0; /* Com
19680 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
19690 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
196a0 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
196b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
196c0 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
196d0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
196e0 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
196f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
19700 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
19710 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
19720 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
19730 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
19740 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
19750 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
19760 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
19770 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
19780 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
19790 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
197a0 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
197b0 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
197c0 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
197d0 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
197e0 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e   columns */.#ifn
197f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19800 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
19810 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub1;            
19820 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
19830 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
19840 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20    int iSub2;    
19850 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
19860 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
19870 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
19880 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
19890 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
198a0 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d  ssert( pKeyDup==
198b0 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64  0 ); /* "Managed
198c0 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69  " code needs thi
198d0 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32  s.  Ticket #3382
198e0 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  . */.  db = pPar
198f0 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50  se->db;.  v = pP
19900 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
19910 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
19920 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20       /* Already 
19930 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72  thrown the error
19940 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66   if VDBE alloc f
19950 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c  ailed */.  label
19960 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
19970 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19980 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
19990 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
199a0 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
199b0 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
199c0 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
199d0 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
199e0 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
199f0 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
19a00 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
19a10 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
19a20 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
19a30 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
19a40 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
19a50 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
19a60 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
19a70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
19a80 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
19a90 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
19aa0 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
19ab0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
19ac0 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
19ad0 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
19ae0 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
19af0 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
19b00 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
19b10 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
19b20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
19b30 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
19b40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19b50 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
19b60 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
19b70 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
19b80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19b90 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
19ba0 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
19bb0 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
19bc0 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
19bd0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
19be0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
19bf0 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
19c00 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
19c10 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19c20 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
19c30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
19c40 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
19c50 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
19c60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
19c70 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
19c80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19c90 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
19ca0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
19cb0 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
19cc0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
19cd0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
19ce0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
19cf0 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  i;.        p->pO
19d00 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
19d10 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
19d20 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
19d30 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77  , pOrderBy, pNew
19d40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19d50 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
19d60 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
19d70 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
19d80 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  l = (u16)i;.    
19d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19da0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
19db0 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
19dc0 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
19dd0 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
19de0 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
19df0 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74  rmutation used t
19e00 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
19e10 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
19e20 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
19e30 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
19e40 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
19e50 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
19e60 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
19e70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19e80 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
19e90 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
19ea0 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
19eb0 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
19ec0 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
19ed0 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
19ee0 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
19ef0 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
19f00 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
19f10 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
19f20 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
19f30 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29  *(nOrderBy + 1))
19f40 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
19f50 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
19f60 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19f70 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74  tem;.    aPermut
19f80 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b  e[0] = nOrderBy;
19f90 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
19fa0 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
19fb0 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b   i<=nOrderBy; i+
19fc0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
19fd0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
19fe0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19ff0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  l>0 );.      ass
1a000 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
1a010 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
1a020 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
1a030 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
1a040 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
1a050 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
1a060 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
1a070 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65  erge = multiSele
1a080 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
1a090 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
1a0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
1a0b0 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
1a0c0 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
1a0d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1a0e0 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
1a0f0 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
1a100 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
1a110 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
1a120 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1a130 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
1a140 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
1a150 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1a160 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
1a170 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
1a180 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
1a190 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
1a1a0 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
1a1b0 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
1a1c0 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
1a1d0 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
1a1e0 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
1a1f0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
1a200 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
1a210 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
1a220 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
1a230 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
1a240 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1a250 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
1a260 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1a270 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
1a280 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
1a290 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a2a0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
1a2b0 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
1a2c0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
1a2d0 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
1a2e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a2f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
1a300 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
1a310 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
1a320 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
1a330 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
1a340 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
1a350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
1a360 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
1a370 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
1a380 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
1a390 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
1a3a0 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
1a3b0 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
1a3c0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
1a3d0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
1a3e0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
1a3f0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1a400 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1a410 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
1a420 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
1a430 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
1a440 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
1a450 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
1a460 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
1a470 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ior->pNext = 0;.
1a480 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1a490 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
1a4a0 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
1a4b0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
1a4c0 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
1a4d0 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
1a4e0 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
1a4f0 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
1a500 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
1a510 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
1a520 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
1a530 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
1a540 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
1a550 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
1a560 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
1a570 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
1a580 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
1a590 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
1a5a0 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
1a5b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1a5c0 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
1a5d0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1a5e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a5f0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
1a600 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
1a610 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
1a620 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
1a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a640 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
1a650 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1a660 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a670 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
1a680 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
1a690 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
1a6a0 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
1a6b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1a6c0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a6d0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
1a6e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1a6f0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1a700 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
1a710 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
1a720 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
1a730 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a740 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
1a750 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a760 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
1a770 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1a780 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
1a790 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
1a7a0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1a7b0 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
1a7c0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
1a7d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1a7e0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
1a7f0 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1a800 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
1a810 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1a820 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1a830 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1a840 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
1a850 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
1a860 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
1a870 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
1a880 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
1a890 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
1a8a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1a8b0 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1a8c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a8d0 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1a8e0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1a8f0 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
1a900 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
1a910 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
1a920 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
1a930 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1a940 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65  itA;.  explainSe
1a950 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
1a960 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
1a970 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
1a980 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1a990 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b  pPrior, &destA);
1a9a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  .  sqlite3VdbeEn
1a9b0 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65  dCoroutine(v, re
1a9c0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
1a9d0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1a9e0 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20  , addr1);..  /* 
1a9f0 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
1aa00 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
1aa10 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1aa20 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
1aa30 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
1aa40 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
1aa50 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
1aa60 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1aa70 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
1aa80 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
1aa90 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1aaa0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1aab0 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72  egAddrB, 0, addr
1aac0 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65  SelectB);.  Vdbe
1aad0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67  Comment((v, "rig
1aae0 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
1aaf0 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
1ab00 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
1ab10 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
1ab20 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
1ab30 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
1ab40 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
1ab50 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
1ab60 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
1ab70 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
1ab80 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
1ab90 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
1aba0 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
1abb0 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
1abc0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1abd0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
1abe0 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
1abf0 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64  routine(v, regAd
1ac00 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
1ac10 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1ac20 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
1ac30 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1ac40 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
1ac50 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
1ac60 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
1ac70 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1ac80 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
1ac90 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1aca0 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1acb0 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
1acc0 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
1acd0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1ace0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1acf0 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
1ad00 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
1ad10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ad20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1ad30 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1ad40 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
1ad50 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1ad60 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1ad70 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1ad80 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
1ad90 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1ada0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1adb0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1adc0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1add0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1ade0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
1adf0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1ae00 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
1ae10 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
1ae20 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
1ae30 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
1ae40 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1ae50 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
1ae60 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
1ae70 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
1ae80 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
1ae90 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
1aea0 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
1aeb0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
1aec0 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
1aed0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1aee0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1aef0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1af00 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
1af10 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1af20 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1af30 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
1af40 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1af50 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
1af60 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1af70 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
1af80 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61   = addrEofA = la
1af90 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  belEnd;.  }else{
1afa0 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1afb0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1afc0 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
1afd0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
1afe0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aff0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1b000 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1b010 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  );.    addrEofA_
1b020 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  noB = sqlite3Vdb
1b030 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b040 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c  eld, regAddrB, l
1b050 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20  abelEnd);.      
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
1b080 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1b0a0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29  oto(v, addrEofA)
1b0b0 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
1b0c0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
1b0d0 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
1b0e0 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
1b0f0 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a  electRow);.  }..
1b100 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1b110 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
1b120 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
1b130 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
1b140 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
1b150 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
1b160 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
1b170 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
1b180 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
1b190 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1b1a0 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
1b1b0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
1b1c0 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e  tRow > pPrior->n
1b1d0 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
1b1e0 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
1b1f0 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
1b200 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1b210 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1b220 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75  v, "eof-B subrou
1b230 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1b240 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56  rEofB = sqlite3V
1b250 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b260 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1b270 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
1b280 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b290 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1b2a0 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64  gAddrA, labelEnd
1b2b0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1b2c0 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1b2d0 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1b2e0 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
1b2f0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1b300 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1b310 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
1b320 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1b330 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
1b340 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
1b350 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
1b360 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1b370 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
1b380 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
1b390 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b3a0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b3b0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1b3c0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b3d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1b3e0 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1b3f0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1b400 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1b410 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
1b420 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1b430 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
1b440 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1b450 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
1b460 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1b470 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1b480 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
1b490 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
1b4a0 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
1b4b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1b4c0 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
1b4d0 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
1b4e0 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
1b4f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b500 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b510 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1b520 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b530 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1b540 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1b550 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1b560 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1b570 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
1b580 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1b590 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
1b5a0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1b5b0 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
1b5c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1b5d0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
1b5e0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1b5f0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1b600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b610 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1b620 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1b630 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
1b640 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b650 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b660 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1b670 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b680 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1b690 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1b6a0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
1b6b0 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69  e runs once to i
1b6c0 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74  nitialize everyt
1b6d0 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  hing..  */.  sql
1b6e0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1b6f0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71  (v, addr1);.  sq
1b700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b710 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b720 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f  AddrA, addrEofA_
1b730 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  noB); VdbeCovera
1b740 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1b750 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b760 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1b770 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1b780 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1b790 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
1b7a0 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
1b7b0 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
1b7c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1b7d0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1b7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b7f0 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
1b800 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
1b810 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
1b820 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
1b830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b840 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
1b850 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64  , destA.iSdst, d
1b860 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64  estB.iSdst, nOrd
1b870 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b890 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
1b8a0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
1b8b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1b8c0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45  eP5(v, OPFLAG_PE
1b8d0 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65  RMUTE);.  sqlite
1b8e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1b8f0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
1b900 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
1b910 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72  AgtB); VdbeCover
1b920 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75  age(v);..  /* Ju
1b930 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
1b940 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
1b950 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
1b960 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
1b970 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b980 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
1b990 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d  );..  /* Reassem
1b9a0 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  bly the compound
1b9b0 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69   query so that i
1b9c0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
1b9d0 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62  correctly.  ** b
1b9e0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
1b9f0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
1ba00 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
1ba10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1ba20 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69  lete(db, p->pPri
1ba30 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50  or);.  }.  p->pP
1ba40 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
1ba50 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
1ba60 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a   p;..  /*** TBD:
1ba70 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74    Insert subrout
1ba80 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f  ine calls to clo
1ba90 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e  se cursors on in
1baa0 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20  complete.  **** 
1bab0 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f  subqueries ****/
1bac0 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
1bad0 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
1bae0 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
1baf0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50   0);.  return pP
1bb00 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d  arse->nErr!=0;.}
1bb10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
1bb20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1bb30 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1bb40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1bb50 4d 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e  MIT_VIEW)../* An
1bb60 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1bb70 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62   SubstContext ob
1bb80 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 61  ject describes a
1bb90 6e 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65  n substitution e
1bba0 64 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72  dit.** to be per
1bbb0 66 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73  formed on a pars
1bbc0 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c  e tree..**.** Al
1bbd0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
1bbe0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65  columns in table
1bbf0 20 69 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62   iTable are to b
1bc00 65 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f  e replaced by co
1bc10 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65  rresponding.** e
1bc20 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45  xpressions in pE
1bc30 4c 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  List..*/.typedef
1bc40 20 73 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e   struct SubstCon
1bc50 74 65 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a  text {.  Parse *
1bc60 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1bc70 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
1bc80 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
1bc90 6e 74 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20  nt iTable;      
1bca0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1bcb0 61 63 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ace references t
1bcc0 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a  o this table */.
1bcd0 20 20 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b    int iNewTable;
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1bcf0 65 77 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  ew table number 
1bd00 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a  */.  int isLeftJ
1bd10 6f 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oin;           /
1bd20 2a 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c  * Add TK_IF_NULL
1bd30 5f 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20  _ROW opcodes on 
1bd40 65 61 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74  each replacement
1bd50 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1bd60 70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  pEList;         
1bd70 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65  /* Replacement e
1bd80 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20  xpressions */.} 
1bd90 53 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f  SubstContext;../
1bda0 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72  * Forward Declar
1bdb0 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
1bdc0 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1bdd0 69 73 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74  ist(SubstContext
1bde0 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  *, ExprList*);.s
1bdf0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1be00 53 65 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74  Select(SubstCont
1be10 65 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69  ext*, Select*, i
1be20 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  nt);../*.** Scan
1be30 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70   through the exp
1be40 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20  ression pExpr.  
1be50 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65  Replace every re
1be60 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20  ference to.** a 
1be70 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
1be80 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69  number iTable wi
1be90 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1bea0 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65   iColumn-th.** e
1beb0 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20  ntry in pEList. 
1bec0 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65   (But leave refe
1bed0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f  rences to the RO
1bee0 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75  WID column .** u
1bef0 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a  nchanged.).**.**
1bf00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1bf10 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61   part of the fla
1bf20 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72  ttening procedur
1bf30 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a  e.  A subquery.*
1bf40 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73  * whose result s
1bf50 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
1bf60 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20   pEList appears 
1bf70 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  as entry in the.
1bf80 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  ** FROM clause o
1bf90 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20  f a SELECT such 
1bfa0 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75  that the VDBE cu
1bfb0 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f  rsor assigned to
1bfc0 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c   that.** FORM cl
1bfd0 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54  ause entry is iT
1bfe0 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  able.  This rout
1bff0 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65  ine makes the ne
1c000 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1c010 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1c020 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1c030 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1c040 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1c050 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1c060 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1c070 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1c080 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1c090 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1c0a0 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20  .  SubstContext 
1c0b0 2a 70 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73  *pSubst,  /* Des
1c0c0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1c0d0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1c0e0 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
1c0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
1c100 20 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69   in which substi
1c110 74 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f  tution occurs */
1c120 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  .){.  if( pExpr=
1c130 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1c140 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
1c150 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46  erty(pExpr, EP_F
1c160 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 70  romJoin).   && p
1c170 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1c180 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69  Table==pSubst->i
1c190 54 61 62 6c 65 0a 20 20 29 7b 0a 20 20 20 20 70  Table.  ){.    p
1c1a0 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1c1b0 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e  Table = pSubst->
1c1c0 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 7d 0a 20  iNewTable;.  }. 
1c1d0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
1c1e0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
1c1f0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62  pr->iTable==pSub
1c200 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20  st->iTable ){.  
1c210 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
1c220 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
1c230 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
1c240 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ULL;.    }else{.
1c250 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
1c260 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  ;.      Expr *pC
1c270 6f 70 79 20 3d 20 70 53 75 62 73 74 2d 3e 70 45  opy = pSubst->pE
1c280 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
1c290 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
1c2a0 20 20 20 20 20 45 78 70 72 20 69 66 4e 75 6c 6c       Expr ifNull
1c2b0 52 6f 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Row;.      asser
1c2c0 74 28 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73  t( pSubst->pELis
1c2d0 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
1c2e0 43 6f 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70  Column<pSubst->p
1c2f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1c300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1c310 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
1c320 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
1c330 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  0 );.      if( s
1c340 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
1c350 6f 72 28 70 43 6f 70 79 29 20 29 7b 0a 20 20 20  or(pCopy) ){.   
1c360 20 20 20 20 20 73 71 6c 69 74 65 33 56 65 63 74       sqlite3Vect
1c370 6f 72 45 72 72 6f 72 4d 73 67 28 70 53 75 62 73  orErrorMsg(pSubs
1c380 74 2d 3e 70 50 61 72 73 65 2c 20 70 43 6f 70 79  t->pParse, pCopy
1c390 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1c3a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20          sqlite3 
1c3b0 2a 64 62 20 3d 20 70 53 75 62 73 74 2d 3e 70 50  *db = pSubst->pP
1c3c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
1c3d0 20 20 69 66 28 20 70 53 75 62 73 74 2d 3e 69 73    if( pSubst->is
1c3e0 4c 65 66 74 4a 6f 69 6e 20 26 26 20 70 43 6f 70  LeftJoin && pCop
1c3f0 79 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  y->op!=TK_COLUMN
1c400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1c410 6d 73 65 74 28 26 69 66 4e 75 6c 6c 52 6f 77 2c  mset(&ifNullRow,
1c420 20 30 2c 20 73 69 7a 65 6f 66 28 69 66 4e 75 6c   0, sizeof(ifNul
1c430 6c 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20  lRow));.        
1c440 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d    ifNullRow.op =
1c450 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b   TK_IF_NULL_ROW;
1c460 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1c470 6c 52 6f 77 2e 70 4c 65 66 74 20 3d 20 70 43 6f  lRow.pLeft = pCo
1c480 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  py;.          if
1c490 4e 75 6c 6c 52 6f 77 2e 69 54 61 62 6c 65 20 3d  NullRow.iTable =
1c4a0 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1c4b0 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  le;.          pC
1c4c0 6f 70 79 20 3d 20 26 69 66 4e 75 6c 6c 52 6f 77  opy = &ifNullRow
1c4d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c4e0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1c4f0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
1c500 6f 70 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  opy, 0);.       
1c510 20 69 66 28 20 70 4e 65 77 20 26 26 20 70 53 75   if( pNew && pSu
1c520 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20  bst->isLeftJoin 
1c530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
1c540 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 4e 65  rSetProperty(pNe
1c550 77 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  w, EP_CanBeNull)
1c560 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c570 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
1c580 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c590 70 45 78 70 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69  pExpr,EP_FromJoi
1c5a0 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n) ){.          
1c5b0 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  pNew->iRightJoin
1c5c0 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69  Table = pExpr->i
1c5d0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
1c5e0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
1c5f0 74 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20  tProperty(pNew, 
1c600 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20  EP_FromJoin);.  
1c610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c620 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1c630 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20  e(db, pExpr);.  
1c640 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
1c650 65 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ew;.      }.    
1c660 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
1c670 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
1c680 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 26 26 20  _IF_NULL_ROW && 
1c690 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
1c6a0 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29 7b  Subst->iTable ){
1c6b0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
1c6c0 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69  able = pSubst->i
1c6d0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  NewTable;.    }.
1c6e0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1c6f0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1c700 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  bst, pExpr->pLef
1c710 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
1c720 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
1c730 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1c740 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69 66  >pRight);.    if
1c750 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1c760 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1c770 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1c780 73 75 62 73 74 53 65 6c 65 63 74 28 70 53 75 62  substSelect(pSub
1c790 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  st, pExpr->x.pSe
1c7a0 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65  lect, 1);.    }e
1c7b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1c7c0 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1c7d0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
1c7e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1c7f0 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
1c800 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1c810 78 70 72 4c 69 73 74 28 0a 20 20 53 75 62 73 74  xprList(.  Subst
1c820 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c  Context *pSubst,
1c830 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1c840 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1c850 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
1c860 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20 20 2f  t *pList       /
1c870 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
1c880 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
1c890 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
1c8a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
1c8b0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1c8c0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
1c8d0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
1c8e0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69  r; i++){.    pLi
1c8f0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  st->a[i].pExpr =
1c900 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1c910 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  t, pList->a[i].p
1c920 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Expr);.  }.}.sta
1c930 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
1c940 6c 65 63 74 28 0a 20 20 53 75 62 73 74 43 6f 6e  lect(.  SubstCon
1c950 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a  text *pSubst, /*
1c960 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1c970 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1c980 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1c990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c9a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1c9b0 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
1c9c0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
1c9d0 2f 0a 20 20 69 6e 74 20 64 6f 50 72 69 6f 72 20  /.  int doPrior 
1c9e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1c9f0 73 75 62 73 74 69 74 75 74 65 73 20 6f 6e 20 70  substitutes on p
1ca00 2d 3e 70 50 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a  ->pPrior too */.
1ca10 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
1ca20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
1ca30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1ca40 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
1ca50 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
1ca60 64 6f 7b 0a 20 20 20 20 73 75 62 73 74 45 78 70  do{.    substExp
1ca70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1ca80 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75  >pEList);.    su
1ca90 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1caa0 73 74 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29  st, p->pGroupBy)
1cab0 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c  ;.    substExprL
1cac0 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  ist(pSubst, p->p
1cad0 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d  OrderBy);.    p-
1cae0 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
1caf0 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e  Expr(pSubst, p->
1cb00 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 70 2d  pHaving);.    p-
1cb10 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
1cb20 78 70 72 28 70 53 75 62 73 74 2c 20 70 2d 3e 70  xpr(pSubst, p->p
1cb30 57 68 65 72 65 29 3b 0a 20 20 20 20 70 53 72 63  Where);.    pSrc
1cb40 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
1cb50 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20  assert( pSrc!=0 
1cb60 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  );.    for(i=pSr
1cb70 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
1cb80 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
1cb90 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1cba0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70 53    substSelect(pS
1cbb0 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e 70 53 65  ubst, pItem->pSe
1cbc0 6c 65 63 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  lect, 1);.      
1cbd0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
1cbe0 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 20  TabFunc ){.     
1cbf0 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1cc00 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d 2d 3e  (pSubst, pItem->
1cc10 75 31 2e 70 46 75 6e 63 41 72 67 29 3b 0a 20 20  u1.pFuncArg);.  
1cc20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
1cc30 68 69 6c 65 28 20 64 6f 50 72 69 6f 72 20 26 26  hile( doPrior &&
1cc40 20 28 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 29   (p = p->pPrior)
1cc50 21 3d 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  !=0 );.}.#endif 
1cc60 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
1cc70 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1cc80 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1cc90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1cca0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
1ccb0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1ccc0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1ccd0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1cce0 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
1ccf0 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
1cd00 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
1cd10 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
1cd20 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
1cd30 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
1cd40 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
1cd50 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
1cd60 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
1cd70 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
1cd80 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
1cd90 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
1cda0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
1cdb0 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
1cdc0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
1cdd0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
1cde0 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
1cdf0 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
1ce00 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
1ce10 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
1ce20 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
1ce30 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
1ce40 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
1ce50 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
1ce60 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
1ce70 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
1ce80 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
1ce90 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
1cea0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
1ceb0 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
1cec0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
1ced0 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
1cee0 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
1cef0 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
1cf00 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
1cf10 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
1cf20 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
1cf30 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
1cf40 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
1cf50 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
1cf60 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
1cf70 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
1cf80 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
1cf90 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
1cfa0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
1cfb0 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
1cfc0 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
1cfd0 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
1cfe0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1cff0 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
1d000 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
1d010 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
1d020 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
1d030 6f 72 20 74 68 69 73 20 73 69 6d 70 6c 69 66 69  or this simplifi
1d040 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
1d050 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
1d060 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
1d070 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
1d080 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
1d090 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
1d0a0 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
1d0b0 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
1d0c0 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
1d0d0 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
1d0e0 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
1d0f0 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 73   Flattening is s
1d100 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f  ubject to the fo
1d110 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73 74 72 61 69  llowing constrai
1d120 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  nts:.**.**  (**)
1d130 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61    We no longer a
1d140 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65  ttempt to flatte
1d150 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  n aggregate subq
1d160 75 65 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20  ueries. Was:.** 
1d170 20 20 20 20 20 20 20 54 68 65 20 73 75 62 71 75         The subqu
1d180 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1d190 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1d1a0 6f 74 68 20 62 65 20 61 67 67 72 65 67 61 74 65  oth be aggregate
1d1b0 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1d1c0 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74  We no longer att
1d1d0 65 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20  empt to flatten 
1d1e0 61 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65  aggregate subque
1d1f0 72 69 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20  ries. Was:.**   
1d200 20 20 20 20 20 28 32 29 20 49 66 20 74 68 65 20       (2) If the 
1d210 73 75 62 71 75 65 72 79 20 69 73 20 61 6e 20 61  subquery is an a
1d220 67 67 72 65 67 61 74 65 20 74 68 65 6e 0a 2a 2a  ggregate then.**
1d230 20 20 20 20 20 20 20 20 28 32 61 29 20 74 68 65          (2a) the
1d240 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75 73   outer query mus
1d250 74 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20  t not be a join 
1d260 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 32  and.**        (2
1d270 62 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  b) the outer que
1d280 72 79 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 20  ry must not use 
1d290 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20  subqueries.**   
1d2a0 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20            other 
1d2b0 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 46 52 4f  than the one FRO
1d2c0 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1d2d0 79 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64  y that is a cand
1d2e0 69 64 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20  idate.**        
1d2f0 20 20 20 20 20 66 6f 72 20 66 6c 61 74 74 65 6e       for flatten
1d300 69 6e 67 2e 20 20 28 54 68 69 73 20 69 73 20 64  ing.  (This is d
1d310 75 65 20 74 6f 20 74 69 63 6b 65 74 20 5b 32 66  ue to ticket [2f
1d320 37 31 37 30 64 37 33 62 66 39 61 62 66 38 30 5d  7170d73bf9abf80]
1d330 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d340 66 72 6f 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e  from 2015-02-09.
1d350 29 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 49  ).**.**   (3)  I
1d360 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1d370 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1d380 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
1d390 49 4e 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  IN then.**      
1d3a0 20 20 28 33 61 29 20 74 68 65 20 73 75 62 71 75    (3a) the subqu
1d3b0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
1d3c0 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20   join and.**    
1d3d0 20 20 20 20 28 33 62 29 20 74 68 65 20 46 52 4f      (3b) the FRO
1d3e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1d3f0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1d400 20 63 6f 6e 74 61 69 6e 20 61 20 76 69 72 74 75   contain a virtu
1d410 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
1d420 20 20 74 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 20    table and.**  
1d430 20 20 20 20 20 20 28 33 63 29 20 74 68 65 20 6f        (3c) the o
1d440 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1d450 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65 67 61  ot be an aggrega
1d460 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  te..**.**   (4) 
1d470 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
1d480 6e 20 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43  n not be DISTINC
1d490 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  T..**.**  (**)  
1d4a0 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73  At one point res
1d4b0 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e  trictions (4) an
1d4c0 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61 20  d (5) defined a 
1d4d0 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e  subset of DISTIN
1d4e0 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  CT.**        sub
1d4f0 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77 65  -queries that we
1d500 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d  re excluded from
1d510 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1d520 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20  on. Restriction 
1d530 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20 68  .**        (4) h
1d540 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78  as since been ex
1d550 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64  panded to exclud
1d560 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73  e all DISTINCT s
1d570 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a  ubqueries..**.**
1d580 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f    (**)  We no lo
1d590 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20  nger attempt to 
1d5a0 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74  flatten aggregat
1d5b0 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 57  e subqueries.  W
1d5c0 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 49 66  as:.**        If
1d5d0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1d5e0 20 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 20   aggregate, the 
1d5f0 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1d600 6e 6f 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e  not be DISTINCT.
1d610 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54 68  .**.**   (7)  Th
1d620 65 20 73 75 62 71 75 65 72 79 20 6d 75 73 74 20  e subquery must 
1d630 68 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75  have a FROM clau
1d640 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1d650 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1d660 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1d670 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1d680 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1d690 4f 4d 20 63 6c 61 75 73 65 20 77 69 74 68 20 74  OM clause with t
1d6a0 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1d6b0 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1d6c0 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1d6d0 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1d6e0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1d6f0 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1d700 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1d710 20 28 38 29 20 20 49 66 20 74 68 65 20 73 75 62   (8)  If the sub
1d720 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1d730 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1d740 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1d750 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
1d760 20 28 39 29 20 20 49 66 20 74 68 65 20 73 75 62   (9)  If the sub
1d770 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1d780 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1d790 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1d7a0 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a   aggregate..**.*
1d7b0 2a 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63  *  (**)  Restric
1d7c0 74 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65  tion (10) was re
1d7d0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63  moved from the c
1d7e0 6f 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30  ode on 2005-02-0
1d7f0 35 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20  5 but we.**     
1d800 20 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61     accidently ca
1d810 72 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e  rried the commen
1d820 74 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20  t forward until 
1d830 32 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69  2014-09-15.  Ori
1d840 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
1d850 63 6f 6e 73 74 72 61 69 6e 74 3a 20 22 49 66 20  constraint: "If 
1d860 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1d870 61 67 67 72 65 67 61 74 65 20 74 68 65 6e 20 74  aggregate then t
1d880 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a  he outer query .
1d890 2a 2a 20 20 20 20 20 20 20 20 6d 61 79 20 6e 6f  **        may no
1d8a0 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1d8b0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1d8c0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1d8d0 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20  outer query may 
1d8e0 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
1d8f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
1d900 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74  **.**  (**)  Not
1d910 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
1d920 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
1d930 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
1d940 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
1d950 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
1d960 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
1d970 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
1d980 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
1d990 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
1d9a0 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
1d9b0 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68  ery may not both
1d9c0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
1d9d0 2a 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62  *  (14)  The sub
1d9e0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73  query may not us
1d9f0 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  e OFFSET..**.** 
1da00 20 28 31 35 29 20 20 49 66 20 74 68 65 20 6f 75   (15)  If the ou
1da10 74 65 72 20 71 75 65 72 79 20 69 73 20 70 61 72  ter query is par
1da20 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1da30 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 74 68 65  select, then the
1da40 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71 75  .**        subqu
1da50 65 72 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20  ery may not use 
1da60 4c 49 4d 49 54 2e 0a 2a 2a 20 20 20 20 20 20 20  LIMIT..**       
1da70 20 28 53 65 65 20 74 69 63 6b 65 74 20 23 32 33   (See ticket #23
1da80 33 39 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30  39 and ticket [0
1da90 32 61 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a  2a8e81d44])..**.
1daa0 2a 2a 20 20 28 31 36 29 20 20 49 66 20 74 68 65  **  (16)  If the
1dab0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1dac0 61 67 67 72 65 67 61 74 65 2c 20 74 68 65 6e 20  aggregate, then 
1dad0 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  the subquery may
1dae0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75   not.**        u
1daf0 73 65 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54  se ORDER BY.  (T
1db00 69 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68  icket #2942)  Th
1db10 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d  is used to not m
1db20 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  atter.**        
1db30 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75  until we introdu
1db40 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f  ced the group_co
1db50 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  ncat() function.
1db60 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20    .**.**  (17)  
1db70 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1db80 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1db90 6c 65 63 74 2c 20 74 68 65 6e 0a 2a 2a 20 20 20  lect, then.**   
1dba0 20 20 20 20 20 28 31 37 61 29 20 61 6c 6c 20 63       (17a) all c
1dbb0 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
1dbc0 73 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  s must be a UNIO
1dbd0 4e 20 41 4c 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20  N ALL, and.**   
1dbe0 20 20 20 20 20 28 31 37 62 29 20 6e 6f 20 74 65       (17b) no te
1dbf0 72 6d 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  rms within the s
1dc00 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64  ubquery compound
1dc10 20 6d 61 79 20 62 65 20 61 67 67 72 65 67 61 74   may be aggregat
1dc20 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1dc30 20 20 6f 72 20 44 49 53 54 49 4e 54 2c 20 61 6e    or DISTINT, an
1dc40 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 63  d.**        (17c
1dc50 29 20 65 76 65 72 79 20 74 65 72 6d 20 77 69 74  ) every term wit
1dc60 68 69 6e 20 74 68 65 20 73 75 62 71 75 65 72 79  hin the subquery
1dc70 20 63 6f 6d 70 6f 75 6e 64 20 6d 75 73 74 20 68   compound must h
1dc80 61 76 65 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  ave a FROM claus
1dc90 65 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 64  e.**        (17d
1dca0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1dcb0 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  y may not be.** 
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37               (17
1dcd0 64 31 29 20 61 67 67 72 65 67 61 74 65 2c 20 6f  d1) aggregate, o
1dce0 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
1dcf0 20 20 28 31 37 64 32 29 20 44 49 53 54 49 4e 43    (17d2) DISTINC
1dd00 54 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  T, or.**        
1dd10 20 20 20 20 20 20 28 31 37 64 33 29 20 61 20 6a        (17d3) a j
1dd20 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  oin..**.**      
1dd30 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
1dd40 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
1dd50 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
1dd60 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
1dd70 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
1dd80 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
1dd90 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
1dda0 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
1ddb0 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
1ddc0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1ddd0 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73   clauses.  The s
1dde0 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75  ubquery cannot u
1ddf0 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  se any compound.
1de00 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1de10 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  or other than UN
1de20 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20  ION ALL because 
1de30 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f  all the other co
1de40 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1de50 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20   operators have 
1de60 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49  an implied DISTI
1de70 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73  NCT which is dis
1de80 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20  allowed by.**   
1de90 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e       restriction
1dea0 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   (4)..**.**     
1deb0 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f     Also, each co
1dec0 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73  mponent of the s
1ded0 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65  ub-query must re
1dee0 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  turn the same nu
1def0 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f  mber.**        o
1df00 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
1df10 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c  . This is actual
1df20 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74  ly a requirement
1df30 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   for any compoun
1df40 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45  d.**        SELE
1df50 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  CT statement, bu
1df60 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68  t all the code h
1df70 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  ere does is make
1df80 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a   sure that no.**
1df90 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c          such (il
1dfa0 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79  legal) sub-query
1dfb0 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54   is flattened. T
1dfc0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64  he caller will d
1dfd0 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20  etect the.**    
1dfe0 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72      syntax error
1dff0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
1e000 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a  tailed message..
1e010 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
1e020 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1e030 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1e040 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
1e050 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
1e060 20 20 20 20 4f 52 44 45 52 20 42 59 20 63 6c 61      ORDER BY cla
1e070 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
1e080 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
1e090 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
1e0a0 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
1e0b0 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
1e0c0 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
1e0d0 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1e0e0 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e   uses LIMIT then
1e0f0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e100 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20   may not.**     
1e110 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
1e120 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
1e130 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
1e140 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1e150 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1e160 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
1e170 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
1e180 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1e190 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
1e1a0 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
1e1b0 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
1e1c0 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
1e1d0 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
1e1e0 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1e1f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1e200 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
1e210 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
1e220 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
1e230 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
1e240 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
1e250 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
1e260 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
1e270 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
1e280 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
1e290 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
1e2a0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1e2b0 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20  uses LIMIT then 
1e2c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1e2d0 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20  may not be.**   
1e2e0 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20       DISTINCT.  
1e2f0 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32  (See ticket [752
1e300 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a  e1646fc])..**.**
1e310 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71    (22)  The subq
1e320 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20  uery may not be 
1e330 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
1e340 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 49 66  .**.**  (23)  If
1e350 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e360 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
1e370 43 54 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75  CTE, then the su
1e380 62 2d 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  b-query may not 
1e390 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 63  be.**        a c
1e3a0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54  ompound query. T
1e3b0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
1e3c0 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73  is because trans
1e3d0 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20  forming the.**  
1e3e0 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20        parent to 
1e3f0 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
1e400 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f   confuses the co
1e410 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a  de that handles.
1e420 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73  **        recurs
1e430 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d  ive queries in m
1e440 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ultiSelect()..**
1e450 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f  .**  (**)  We no
1e460 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20   longer attempt 
1e470 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65  to flatten aggre
1e480 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e  gate subqueries.
1e490 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20    Was:.**       
1e4a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   The subquery ma
1e4b0 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72  y not be an aggr
1e4c0 65 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20  egate that uses 
1e4d0 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e  the built-in min
1e4e0 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20  () or .**       
1e4f0 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69   or max() functi
1e500 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74  ons.  (Without t
1e510 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c  his restriction,
1e520 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a   a query like:.*
1e530 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  *        "SELECT
1e540 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   x FROM (SELECT 
1e550 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74  max(y), x FROM t
1e560 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65  1)" would not ne
1e570 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20  cessarily.**    
1e580 20 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76      return the v
1e590 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68  alue X for which
1e5a0 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29   Y was maximal.)
1e5b0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  .**.**.** In thi
1e5c0 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22  s routine, the "
1e5d0 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  p" parameter is 
1e5e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e5f0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a   outer query..**
1e600 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1e610 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f   p->pSrc->a[iFro
1e620 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72  m].  isAgg is tr
1e630 75 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  ue if the outer 
1e640 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67  query.** uses ag
1e650 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1e660 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
1e670 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
1e680 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e690 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
1e6a0 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
1e6b0 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
1e6c0 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
1e6d0 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
1e6e0 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
1e6f0 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
1e700 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
1e710 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
1e720 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
1e730 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
1e740 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
1e750 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1e760 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
1e770 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1e780 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
1e790 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1e7a0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1e7b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1e7c0 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
1e7d0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
1e7e0 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
1e7f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1e800 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
1e810 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
1e820 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
1e830 69 73 41 67 67 20 20 20 20 20 20 20 20 20 20 20  isAgg           
1e840 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
1e850 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
1e860 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1e870 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
1e880 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68  char *zSavedAuth
1e890 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
1e8a0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
1e8b0 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e    Select *pParen
1e8c0 74 3b 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  t;    /* Current
1e8d0 20 55 4e 49 4f 4e 20 41 4c 4c 20 74 65 72 6d 20   UNION ALL term 
1e8e0 6f 66 20 74 68 65 20 6f 74 68 65 72 20 71 75 65  of the other que
1e8f0 72 79 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ry */.  Select *
1e900 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54  pSub;       /* T
1e910 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f  he inner query o
1e920 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a  r "subquery" */.
1e930 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b    Select *pSub1;
1e940 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1e950 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73   to the rightmos
1e960 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d  t select in sub-
1e970 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
1e980 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f  st *pSrc;      /
1e990 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1e9a0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
1e9b0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1e9c0 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a  t *pSubSrc;   /*
1e9d0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1e9e0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1e9f0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
1ea00 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42  t;        /* VDB
1ea10 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
1ea20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75  of the pSub resu
1ea30 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c  lt set temp tabl
1ea40 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 50  e */.  int iNewP
1ea50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f 2a 20 52 65  arent = -1;/* Re
1ea60 70 6c 61 63 65 6d 65 6e 74 20 74 61 62 6c 65 20  placement table 
1ea70 66 6f 72 20 69 50 61 72 65 6e 74 20 2a 2f 0a 20  for iParent */. 
1ea80 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20   int isLeftJoin 
1ea90 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20  = 0; /* True if 
1eaa0 70 53 75 62 20 69 73 20 74 68 65 20 72 69 67 68  pSub is the righ
1eab0 74 20 73 69 64 65 20 6f 66 20 61 20 4c 45 46 54  t side of a LEFT
1eac0 20 4a 4f 49 4e 20 2a 2f 20 20 20 20 0a 20 20 69   JOIN */    .  i
1ead0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1eae0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1eaf0 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  er */.  Expr *pW
1eb00 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  here;           
1eb10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1eb20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1eb30 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1eb40 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b  _item *pSubitem;
1eb50 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
1eb60 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
1eb70 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1eb80 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1eb90 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69   see if flatteni
1eba0 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
1ebb0 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f    Return 0 if no
1ebc0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1ebd0 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
1ebe0 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  rt( p->pPrior==0
1ebf0 20 29 3b 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   );.  if( Optimi
1ec00 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
1ec10 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46  b, SQLITE_QueryF
1ec20 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75  lattener) ) retu
1ec30 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70  rn 0;.  pSrc = p
1ec40 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
1ec50 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e  ( pSrc && iFrom>
1ec60 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63  =0 && iFrom<pSrc
1ec70 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62  ->nSrc );.  pSub
1ec80 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  item = &pSrc->a[
1ec90 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e  iFrom];.  iParen
1eca0 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43  t = pSubitem->iC
1ecb0 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20  ursor;.  pSub = 
1ecc0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1ecd0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  t;.  assert( pSu
1ece0 62 21 3d 30 20 29 3b 0a 0a 20 20 70 53 75 62 53  b!=0 );..  pSubS
1ecf0 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1ed00 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
1ed10 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
1ed20 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
1ed30 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
1ed40 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
1ed50 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
1ed60 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
1ed70 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1ed80 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20  ons, we allowed 
1ed90 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f  some combining o
1eda0 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  f LIMIT and OFFS
1edb0 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  ET.  ** because 
1edc0 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f  they could be co
1edd0 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c  mputed at compil
1ede0 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65  e-time.  But whe
1edf0 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1ee00 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61  ET.  ** became a
1ee10 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1ee20 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f  ions, we were fo
1ee30 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74  rced to add rest
1ee40 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20  rictions (13).  
1ee50 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a  ** and (14). */.
1ee60 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1ee70 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20  it && p->pLimit 
1ee80 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1ee90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1eea0 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a  riction (13) */.
1eeb0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66    if( pSub->pOff
1eec0 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  set ) return 0; 
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1eef0 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a  riction (14) */.
1ef00 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
1ef10 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64  gs & SF_Compound
1ef20 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c  )!=0 && pSub->pL
1ef30 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
1ef40 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1ef80 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
1ef90 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
1efa0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efc0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1efd0 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
1efe0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1eff0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
1f000 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1f010 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f020 69 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69 66  ion (4)  */.  if
1f030 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1f040 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
1f050 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
1f060 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1f070 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f080 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20  ons (8)(9) */.  
1f090 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
1f0a0 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
1f0b0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
1f0c0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f100 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
1f110 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
1f120 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
1f130 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f140 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f150 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
1f160 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f170 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
1f180 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f190 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f1a0 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
1f1b0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f1c0 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
1f1d0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1f1e0 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
1f1f0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1f200 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
1f210 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
1f220 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  b->selFlags & (S
1f230 46 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b 0a  F_Recursive) ){.
1f240 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f250 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 32   Restrictions (2
1f260 32 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  2) */.  }.  if( 
1f270 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f280 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
1f290 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1f2a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f2b0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33   Restriction (23
1f2c0 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ) */.  }..  /*. 
1f2d0 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
1f2e0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f2f0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f300 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
1f310 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1f320 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1f330 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45  n itself (3a). E
1f340 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68  xample of why th
1f350 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  is is not.  ** a
1f360 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1f370 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1f380 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1f390 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1f3a0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1f3b0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1f3c0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1f3d0 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1f3e0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1f3f0 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1f400 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1f410 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1f420 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1f430 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
1f440 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f450 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f460 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
1f470 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
1f480 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ry cannot be an 
1f490 61 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20  aggregate. (3c) 
1f4a0 20 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69   This is an arti
1f4b0 66 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a  fact of the way.
1f4c0 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20    ** aggregates 
1f4d0 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20  are processed - 
1f4e0 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68  there is no mech
1f4f0 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69  anism to determi
1f500 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c  ne if.  ** the L
1f510 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73  EFT JOIN table s
1f520 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c  hould be all-NUL
1f530 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  L..  **.  ** See
1f540 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33   also tickets #3
1f550 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33  06, #350, and #3
1f560 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  300..  */.  if( 
1f570 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f  (pSubitem->fg.jo
1f580 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1f590 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c  R)!=0 ){.    isL
1f5a0 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20  eftJoin = 1;.   
1f5b0 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1f5c0 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c  rc>1 || isAgg ||
1f5d0 20 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53   IsVirtual(pSubS
1f5e0 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  rc->a[0].pTab) )
1f5f0 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29  {.      /*  (3a)
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63               (3c
1f610 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20  )     (3b) */.  
1f620 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1f630 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
1f640 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55  QLITE_EXTRA_IFNU
1f650 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28  LLROW.  else if(
1f660 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41   iFrom>0 && !isA
1f670 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74  gg ){.    /* Set
1f680 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20  ting isLeftJoin 
1f690 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f  to -1 causes OP_
1f6a0 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65  IfNullRow opcode
1f6b0 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  s to be generate
1f6c0 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  d for.    ** eve
1f6d0 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ry reference to 
1f6e0 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  any result colum
1f6f0 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20  n from subquery 
1f700 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a  in a join, even.
1f710 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68      ** though th
1f720 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73  ey are not neces
1f730 73 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c  sary.  This will
1f740 20 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65   stress-test the
1f750 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20   OP_IfNullRow . 
1f760 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f     ** opcode. */
1f770 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
1f780 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  = -1;.  }.#endif
1f790 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
1f7a0 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20  on (17): If the 
1f7b0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1f7c0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
1f7d0 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
1f7e0 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
1f7f0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1f800 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
1f810 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
1f820 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
1f830 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
1f840 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
1f850 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
1f860 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
1f870 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
1f880 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
1f890 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1f8a0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
1f8b0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1f8c0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
1f8d0 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a  striction (20) *
1f8e0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
1f8f0 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
1f900 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1f910 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
1f920 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
1f930 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28    return 0; /* (
1f940 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f  17d1), (17d2), o
1f950 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20  r (17d3) */.    
1f960 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
1f970 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
1f980 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
1f990 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1f9a0 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1f9b0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1f9c0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1f9d0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
1f9e0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f9f0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1fa00 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1fa10 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1fa20 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
1fa30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fa40 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
1fa50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fa60 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
1fa70 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr==pSub1->pELis
1fa80 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1fa90 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
1faa0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1fab0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1fac0 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31  te))!=0    /* (1
1fad0 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  7b) */.       ||
1fae0 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
1faf0 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
1fb00 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20  _ALL)           
1fb10 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a        /* (17a) *
1fb20 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  /.       || pSub
1fb30 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20  1->pSrc->nSrc<1 
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20   /* (17c) */.   
1fb70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
1fb80 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1fb90 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fba0 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1fbb0 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
1fbc0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1fbd0 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66   (18). */.    if
1fbe0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1fbf0 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1fc00 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1fc10 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
1fc20 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1fc30 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
1fc40 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
1fc50 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
1fc60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1fc70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1fc80 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
1fc90 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
1fca0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1fcb0 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
1fcc0 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
1fcd0 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
1fce0 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %s.%p from ter
1fcf0 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
1fd10 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62  ->zSelName, pSub
1fd20 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
1fd30 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
1fd40 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
1fd50 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1fd60 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
1fd70 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
1fd80 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
1fd90 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1fda0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
1fdb0 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
1fdc0 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
1fdd0 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
1fde0 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
1fdf0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
1fe00 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
1fe10 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
1fe20 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
1fe30 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
1fe40 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
1fe50 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
1fe60 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
1fe70 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
1fe80 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
1fe90 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
1fea0 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
1feb0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1fec0 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
1fed0 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
1fee0 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
1fef0 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
1ff00 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
1ff10 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
1ff20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
1ff30 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
1ff40 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
1ff50 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
1ff60 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
1ff70 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
1ff80 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
1ff90 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
1ffa0 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
1ffb0 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
1ffc0 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
1ffd0 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
1ffe0 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
1fff0 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
20000 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
20010 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
20020 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
20030 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
20040 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
20050 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
20060 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
20070 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
20080 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
20090 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
200a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
200b0 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
200c0 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
200d0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
200e0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
200f0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
20100 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
20110 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
20120 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
20130 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
20140 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
20150 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
20160 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
20170 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
20180 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
20190 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
201a0 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
201b0 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
201c0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
201d0 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
201e0 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
201f0 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
20200 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
20210 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
20220 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
20230 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
20240 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
20250 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
20260 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
20270 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
20280 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
20290 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
202a0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
202b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
202c0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
202d0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
202e0 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
202f0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
20300 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
20310 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
20320 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
20330 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
20340 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
20350 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
20360 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  it = 0;.    p->p
20370 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
20380 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
20390 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
203a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
203b0 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77  lectSetName(pNew
203c0 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65  , pSub->zSelName
203d0 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  );.    p->pOffse
203e0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
203f0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
20400 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
20410 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
20420 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
20430 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
20440 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
20450 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
20460 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
20470 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
20480 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
20490 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
204a0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
204b0 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
204c0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
204d0 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
204e0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
204f0 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
20500 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
20510 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63  ,p,.         ("c
20520 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
20530 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74   flattener creat
20540 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
20550 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e  \n",.         pN
20560 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e  ew->zSelName, pN
20570 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew));.    }.    
20580 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
20590 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
205a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
205b0 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
205c0 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
205d0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
205e0 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
205f0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
20600 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
20610 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
20620 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
20630 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
20640 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
20650 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20660 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
20670 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
20680 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
20690 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
206a0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
206b0 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
206c0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
206d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
206e0 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
206f0 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
20700 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
20710 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
20720 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
20730 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
20740 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
20750 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
20760 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
20770 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
20780 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
20790 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
207a0 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
207b0 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
207c0 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
207d0 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
207e0 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
207f0 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
20800 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
20810 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
20820 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
20830 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
20840 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
20850 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
20860 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
20870 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
20880 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
20890 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
208a0 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
208b0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
208c0 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
208d0 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
208e0 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
208f0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
20900 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
20910 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
20920 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
20930 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
20940 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
20950 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
20960 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
20970 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
20980 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
20990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
209a0 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
209b0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
209c0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
209d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
209e0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
209f0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
20a00 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
20a10 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
20a20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
20a30 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
20a40 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
20a50 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
20a60 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
20a70 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
20a80 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
20a90 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
20aa0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
20ab0 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
20ac0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
20ad0 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
20ae0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
20af0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
20b00 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
20b10 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
20b20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
20b30 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
20b40 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
20b50 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
20b60 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
20b70 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
20b80 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
20b90 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
20ba0 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
20bb0 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
20bc0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
20bd0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
20be0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
20bf0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
20c00 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
20c10 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
20c20 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
20c30 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
20c40 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
20c50 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
20c60 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
20c70 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
20c80 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
20c90 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
20ca0 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
20cb0 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
20cc0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
20cd0 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
20ce0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
20cf0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
20d00 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
20d10 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
20d20 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
20d30 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
20d40 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
20d50 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
20d60 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
20d70 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
20d80 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
20d90 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
20da0 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
20db0 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
20dc0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
20dd0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
20de0 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
20df0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
20e00 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
20e10 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
20e20 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
20e30 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
20e40 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
20e50 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  >fg.jointype;.  
20e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
20e70 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
20e80 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
20e90 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
20ea0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
20eb0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
20ec0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
20ed0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
20ee0 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
20ef0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20f00 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSrc==0 ){.     
20f10 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
20f20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
20f30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20f40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
20f50 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
20f60 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73   uses a single s
20f70 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  lot of the FROM 
20f80 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
20f90 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ter.    ** query
20fa0 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  .  If the subque
20fb0 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  ry has more than
20fc0 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20   one element in 
20fd0 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  its FROM clause,
20fe0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70  .    ** then exp
20ff0 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
21000 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  ery to make spac
21010 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64  e for it to hold
21020 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20   all elements.  
21030 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71    ** of the subq
21040 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
21050 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
21060 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45   **.    **    SE
21070 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41  LECT * FROM tabA
21080 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , (SELECT * FROM
21090 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61   sub1, sub2), ta
210a0 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  bB;.    **.    *
210b0 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72  * The outer quer
210c0 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e  y has 3 slots in
210d0 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
210e0 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74  .  One slot of t
210f0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
21100 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c  query (the middl
21110 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20  e slot) is used 
21120 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  by the subquery.
21130 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a    The next.    *
21140 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  * block of code 
21150 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20  will expand the 
21160 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
21170 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f   clause to 4 slo
21180 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d  ts..    ** The m
21190 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78  iddle slot is ex
211a0 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
211b0 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
211c0 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a  make space.    *
211d0 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c  * for the two el
211e0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
211f0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
21200 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
21210 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
21220 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
21230 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
21240 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
21250 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
21260 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
21270 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
21280 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
21290 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
212a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
212b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
212c0 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
212d0 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
212e0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
212f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
21300 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
21310 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
21320 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
21330 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
21340 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
21350 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
21360 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ing);.      asse
21370 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  rt( pSrc->a[i+iF
21380 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e  rom].fg.isTabFun
21390 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  c==0 );.      pS
213a0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
213b0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
213c0 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74        iNewParent
213d0 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
213e0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
213f0 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
21400 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
21410 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
21420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
21430 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f  ->a[iFrom].fg.jo
21440 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
21450 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
21460 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
21470 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
21480 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
21490 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
214a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
214b0 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
214c0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
214d0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
214e0 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
214f0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
21500 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
21510 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
21520 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
21530 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
21540 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
21550 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
21560 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
21570 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
21580 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
21590 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
215a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
215b0 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
215c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
215d0 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
215e0 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
215f0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
21600 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
21610 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
21620 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
21630 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
21640 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
21650 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
21660 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
21670 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
21680 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
21690 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
216a0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
216b0 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f  nt, any non-zero
216c0 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
216d0 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ues indicate tha
216e0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  t the.      ** O
216f0 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65  RDER BY column e
21700 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65  xpression is ide
21710 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f  ntical to the iO
21720 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20  rderByCol'th.   
21730 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
21740 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
21750 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
21760 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20  ub. Since these 
21770 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
21780 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  do not necessari
21790 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ly correspond to
217a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45   columns in SELE
217b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61  CT statement pPa
217c0 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a  rent,.      ** z
217d0 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20  ero them before 
217e0 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20  transfering the 
217f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
21800 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21810 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69  ** Not doing thi
21820 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65  s may cause an e
21830 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71  rror if a subseq
21840 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69  uent call to thi
21850 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
21860 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
21870 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75  flatten a compou
21880 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74  nd sub-query int
21890 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20  o pParent.      
218a0 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79  ** (the only way
218b0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
218c0 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f   is if the compo
218d0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73  und sub-query is
218e0 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
218f0 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62  tly part of pSub
21900 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63  ->pSrc). See tic
21910 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d  ket [d11a6e908f]
21920 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  .  */.      Expr
21930 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
21940 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
21950 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21960 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
21970 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
21980 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21990 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
219a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
219b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
219c0 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
219d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
219e0 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30   pSub->pPrior==0
219f0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
21a00 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  t->pOrderBy = pO
21a10 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
21a20 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
21a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65  ;.    }.    pWhe
21a40 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
21a50 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
21a60 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  here, 0);.    if
21a70 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29  ( isLeftJoin>0 )
21a80 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45  {.      setJoinE
21a90 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77  xpr(pWhere, iNew
21aa0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  Parent);.    }. 
21ab0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65     pParent->pWhe
21ac0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
21ad0 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65 2c 20  And(db, pWhere, 
21ae0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 29  pParent->pWhere)
21af0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
21b00 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
21b10 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e 74  .      SubstCont
21b20 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e 70  ext x;.      x.p
21b30 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
21b40 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d        x.iTable =
21b50 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20   iParent;.      
21b60 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e  x.iNewTable = iN
21b70 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  ewParent;.      
21b80 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69  x.isLeftJoin = i
21b90 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20  sLeftJoin;.     
21ba0 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62   x.pEList = pSub
21bb0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
21bc0 73 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c 20  substSelect(&x, 
21bd0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20  pParent, 0);.   
21be0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
21bf0 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
21c00 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
21c10 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
21c20 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
21c30 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
21c40 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
21c50 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
21c60 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
21c70 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
21c80 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
21c90 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
21ca0 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
21cb0 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
21cc0 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
21cd0 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
21ce0 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
21cf0 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
21d00 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
21d10 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
21d20 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
21d30 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
21d40 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
21d50 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
21d60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
21d70 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
21d80 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
21d90 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
21da0 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
21db0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
21dc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
21dd0 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
21de0 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
21df0 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
21e00 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
21e10 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
21e20 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
21e30 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45   pSub1);..#if SE
21e40 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
21e50 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  D.  if( sqlite3S
21e60 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31  electTrace & 0x1
21e70 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54  00 ){.    SELECT
21e80 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
21e90 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61  se,p,("After fla
21ea0 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20  ttening:\n"));. 
21eb0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
21ec0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
21ed0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
21ee0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
21ef0 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
21f00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21f10 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
21f20 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
21f30 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  EW) */....#if !d
21f40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21f50 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
21f60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
21f70 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
21f80 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
21f90 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63  relevant WHERE c
21fa0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74  lause terms of t
21fb0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
21fc0 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45  nto.** the WHERE
21fd0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
21fe0 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a  ery.  Example:.*
21ff0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
22000 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
22010 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
22020 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d  ROM t1) WHERE x=
22030 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a  5 AND y=10;.**.*
22040 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  * Transformed in
22050 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  to:.**.**    SEL
22060 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
22070 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
22080 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S y FROM t1 WHER
22090 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30  E a=5 AND c-d=10
220a0 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78  ).**     WHERE x
220b0 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
220c0 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20 74  ** The hope is t
220d0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61 64  hat the terms ad
220e0 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72  ded to the inner
220f0 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65   query will make
22100 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69   it more.** effi
22110 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  cient..**.** Do 
22120 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69 73  not attempt this
22130 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
22140 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 28 2a  :.**.**   (1) (*
22150 2a 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69  * This restricti
22160 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 6f  on was removed o
22170 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e 20 20 57  n 2017-09-29.  W
22180 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20 20 20 20  e used to.**    
22190 20 20 20 20 20 20 20 64 69 73 61 6c 6c 6f 77 20         disallow 
221a0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
221b0 6e 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  n for aggregate 
221c0 73 75 62 71 75 65 72 69 65 73 2c 20 62 75 74 20  subqueries, but 
221d0 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
221e0 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 62   it is allowed b
221f0 79 20 70 75 74 74 69 6e 67 20 74 68 65 20 65 78  y putting the ex
22200 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  tra terms on the
22210 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 0a   HAVING clause..
22220 2a 2a 20 20 20 20 20 20 20 20 20 20 20 54 68 65  **           The
22230 20 61 64 64 65 64 20 48 41 56 49 4e 47 20 63 6c   added HAVING cl
22240 61 75 73 65 20 69 73 20 70 6f 69 6e 74 6c 65 73  ause is pointles
22250 73 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  s if the subquer
22260 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20 20 20 20  y lacks.**      
22270 20 20 20 20 20 61 20 47 52 4f 55 50 20 42 59 20       a GROUP BY 
22280 63 6c 61 75 73 65 2e 20 20 42 75 74 20 73 75 63  clause.  But suc
22290 68 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73  h a HAVING claus
222a0 65 20 69 73 20 61 6c 73 6f 20 68 61 72 6d 6c 65  e is also harmle
222b0 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ss.**           
222c0 73 6f 20 74 68 65 72 65 20 64 6f 65 73 20 6e 6f  so there does no
222d0 74 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 61  t appear to be a
222e0 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20 61 64 64  ny reason to add
222f0 20 65 78 74 72 61 20 6c 6f 67 69 63 0a 2a 2a 20   extra logic.** 
22300 20 20 20 20 20 20 20 20 20 20 74 6f 20 73 75 70            to sup
22310 70 72 65 73 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a  press it. **).**
22320 0a 2a 2a 20 20 20 28 32 29 20 54 68 65 20 69 6e  .**   (2) The in
22330 6e 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65  ner query is the
22340 20 72 65 63 75 72 73 69 76 65 20 70 61 72 74 20   recursive part 
22350 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  of a common tabl
22360 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  e expression..**
22370 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 20 69 6e  .**   (3) The in
22380 6e 65 72 20 71 75 65 72 79 20 68 61 73 20 61 20  ner query has a 
22390 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 28 73 69  LIMIT clause (si
223a0 6e 63 65 20 74 68 65 20 63 68 61 6e 67 65 73 20  nce the changes 
223b0 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
223c0 20 20 20 20 20 20 63 6c 6f 73 65 20 77 6f 75 6c        close woul
223d0 64 20 63 68 61 6e 67 65 20 74 68 65 20 6d 65 61  d change the mea
223e0 6e 69 6e 67 20 6f 66 20 74 68 65 20 4c 49 4d 49  ning of the LIMI
223f0 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  T)..**.**   (4) 
22400 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
22410 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
22420 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a  rand of a LEFT J
22430 4f 49 4e 2e 20 20 28 54 68 65 20 63 61 6c 6c 65  OIN.  (The calle
22440 72 0a 2a 2a 20 20 20 20 20 20 20 65 6e 66 6f 72  r.**       enfor
22450 63 65 73 20 74 68 69 73 20 72 65 73 74 72 69 63  ces this restric
22460 74 69 6f 6e 20 73 69 6e 63 65 20 74 68 69 73 20  tion since this 
22470 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
22480 20 68 61 76 65 20 65 6e 6f 75 67 68 0a 2a 2a 20   have enough.** 
22490 20 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f        informatio
224a0 6e 20 74 6f 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a  n to know.).**.*
224b0 2a 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52  *   (5) The WHER
224c0 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
224d0 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69  ion originates i
224e0 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
224f0 47 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20  G clause.**     
22500 20 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e    of a LEFT JOIN
22510 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
22520 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61   if no changes a
22530 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d  re made and non-
22540 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d  zero if one or m
22550 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
22560 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75  .** terms are du
22570 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68  plicated into th
22580 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
22590 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f  tatic int pushDo
225a0 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20  wnWhereTerms(.  
225b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
225c0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
225d0 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c  ontext (for mall
225e0 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72  oc() and error r
225f0 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53  eporting) */.  S
22600 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
22610 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
22620 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
22630 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
22640 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
22650 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
22660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
22670 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
22680 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
22690 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 20 20    int iCursor   
226a0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
226b0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
226c0 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20  subquery */.){. 
226d0 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
226e0 6e 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20  nt nChng = 0;.  
226f0 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20  if( pWhere==0 ) 
22700 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
22710 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20  pSubq->selFlags 
22720 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
22730 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72   return 0;  /* r
22740 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 2a  estriction (2) *
22750 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
22760 5f 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79  _DEBUG.  /* Only
22770 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
22780 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61  of a compound ca
22790 6e 20 68 61 76 65 20 61 20 57 49 54 48 20 63 6c  n have a WITH cl
227a0 61 75 73 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a  ause.  But make.
227b0 20 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68    ** sure no oth
227c0 65 72 20 74 65 72 6d 73 20 61 72 65 20 6d 61 72  er terms are mar
227d0 6b 65 64 20 53 46 5f 52 65 63 75 72 73 69 76 65  ked SF_Recursive
227e0 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 74 68 69   in case somethi
227f0 6e 67 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  ng changes.  ** 
22800 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 20  in the future.. 
22810 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65   */.  {.    Sele
22820 63 74 20 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f  ct *pX;  .    fo
22830 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20  r(pX=pSubq; pX; 
22840 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a  pX=pX->pPrior){.
22850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
22860 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  X->selFlags & (S
22870 46 5f 52 65 63 75 72 73 69 76 65 29 29 3d 3d 30  F_Recursive))==0
22880 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   );.    }.  }.#e
22890 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53 75 62  ndif..  if( pSub
228a0 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a  q->pLimit!=0 ){.
228b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
228c0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
228d0 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28   */.  }.  while(
228e0 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
228f0 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67  AND ){.    nChng
22900 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72   += pushDownWher
22910 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  eTerms(pParse, p
22920 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52  Subq, pWhere->pR
22930 69 67 68 74 2c 20 69 43 75 72 73 6f 72 29 3b 0a  ight, iCursor);.
22940 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68      pWhere = pWh
22950 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a  ere->pLeft;.  }.
22960 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
22970 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f  perty(pWhere,EP_
22980 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74 75  FromJoin) ) retu
22990 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
229a0 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 69 66  tion (5) */.  if
229b0 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  ( sqlite3ExprIsT
229c0 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68  ableConstant(pWh
229d0 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b  ere, iCursor) ){
229e0 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
229f0 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29    while( pSubq )
22a00 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
22a10 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e  text x;.      pN
22a20 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
22a30 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
22a40 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
22a50 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61    x.pParse = pPa
22a60 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61  rse;.      x.iTa
22a70 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20  ble = iCursor;. 
22a80 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65       x.iNewTable
22a90 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20   = iCursor;.    
22aa0 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d    x.isLeftJoin =
22ab0 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69   0;.      x.pELi
22ac0 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69  st = pSubq->pELi
22ad0 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  st;.      pNew =
22ae0 20 73 75 62 73 74 45 78 70 72 28 26 78 2c 20 70   substExpr(&x, p
22af0 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
22b00 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20  pSubq->selFlags 
22b10 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
22b20 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d  {.        pSubq-
22b30 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
22b40 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
22b50 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48 61  ->db, pSubq->pHa
22b60 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ving, pNew);.   
22b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22b80 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20    pSubq->pWhere 
22b90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
22ba0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75  (pParse->db, pSu
22bb0 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77  bq->pWhere, pNew
22bc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
22bd0 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e   pSubq = pSubq->
22be0 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  pPrior;.    }.  
22bf0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67  }.  return nChng
22c00 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
22c10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
22c20 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
22c30 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
22c40 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
22c50 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68  *.** Based on th
22c60 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22c70 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
22c80 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
22c90 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
22ca0 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e  gument, this fun
22cb0 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
22cc0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
22cd0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
22ce0 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e   * the query con
22cf0 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e  tains just a sin
22d00 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75  gle aggregate fu
22d10 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20  nction,.**    * 
22d20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
22d30 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72  nction is either
22d40 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c   min() or max(),
22d50 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65   and.**    * the
22d60 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
22d70 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
22d80 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
22d90 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  value..**.** If 
22da0 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
22db0 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20   are true, then 
22dc0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
22dd0 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
22de0 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74  BY_MAX.** is ret
22df0 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72  urned as appropr
22e00 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d  iate. Also, *ppM
22e10 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
22e20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a  point to the .**
22e30 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e   list of argumen
22e40 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
22e50 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72   aggregate befor
22e60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
22e70 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f  ** Or, if the co
22e80 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61  nditions above a
22e90 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d  re not met, *ppM
22ea0 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
22eb0 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f  0 and.** WHERE_O
22ec0 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73  RDERBY_NORMAL is
22ed0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
22ee0 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
22ef0 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67  ery(AggInfo *pAg
22f00 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20  gInfo, ExprList 
22f10 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69  **ppMinMax){.  i
22f20 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f  nt eRet = WHERE_
22f30 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20  ORDERBY_NORMAL; 
22f40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
22f50 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a  rn value */..  *
22f60 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20  ppMinMax = 0;.  
22f70 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
22f80 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78  unc==1 ){.    Ex
22f90 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67  pr *pExpr = pAgg
22fa0 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
22fb0 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61  Expr; /* Aggrega
22fc0 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
22fd0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
22fe0 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
22ff0 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72  List;      /* Ar
23000 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66  guments to agg f
23010 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  unction */..    
23020 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
23030 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
23040 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  ON );.    if( pE
23050 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
23060 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69  nExpr==1 && pELi
23070 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
23080 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
23090 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  N ){.      const
230a0 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70   char *zFunc = p
230b0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
230c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
230d0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
230e0 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "min")==0 ){.   
230f0 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
23100 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
23110 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
23120 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
23130 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
23140 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
23150 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20   "max")==0 ){.  
23160 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
23170 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
23180 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
23190 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
231a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
231b0 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d   assert( *ppMinM
231c0 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e  ax==0 || (*ppMin
231d0 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  Max)->nExpr==1 )
231e0 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b  ;.  return eRet;
231f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
23200 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
23210 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
23220 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
23230 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
23240 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
23250 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
23260 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
23270 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
23280 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
23290 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
232a0 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
232b0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
232c0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
232d0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
232e0 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
232f0 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
23300 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
23310 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
23320 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
23330 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
23340 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
23350 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
23360 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
23370 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
23380 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
23390 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
233a0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
233b0 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
233c0 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
233d0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
233e0 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
233f0 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
23400 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
23410 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
23420 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
23430 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
23440 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
23450 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
23460 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
23470 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
23480 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
23490 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
234a0 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
234b0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
234c0 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
234d0 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
234e0 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
234f0 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
23500 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
23510 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
23520 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
23530 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
23540 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
23550 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  VER(pAggInfo->nF
23560 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  unc==0) ) return
23570 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
23580 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
23590 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53  unc->funcFlags&S
235a0 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54  QLITE_FUNC_COUNT
235b0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
235c0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c  .  if( pExpr->fl
235d0 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20  ags&EP_Distinct 
235e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72  ) return 0;..  r
235f0 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
23600 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72  *.** If the sour
23610 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73  ce-list item pas
23620 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
23630 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64  nt was augmented
23640 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45   with an.** INDE
23650 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74  XED BY clause, t
23660 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74  hen try to locat
23670 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  e the specified 
23680 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a  index. If there.
23690 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c  ** was such a cl
236a0 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d  ause and the nam
236b0 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  ed index cannot 
236c0 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  be found, return
236d0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
236e0 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65  R and leave an e
236f0 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20  rror in pParse. 
23700 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c  Otherwise, popul
23710 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70  ate .** pFrom->p
23720 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e  Index and return
23730 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
23740 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  nt sqlite3Indexe
23750 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20  dByLookup(Parse 
23760 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20  *pParse, struct 
23770 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
23780 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f  rom){.  if( pFro
23790 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d  m->pTab && pFrom
237a0 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79  ->fg.isIndexedBy
237b0 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
237c0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
237d0 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49 6e  b;.    char *zIn
237e0 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d 2d  dexedBy = pFrom-
237f0 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b 0a  >u1.zIndexedBy;.
23800 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
23810 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
23820 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20  ab->pIndex; .   
23830 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c       pIdx && sql
23840 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78  ite3StrICmp(pIdx
23850 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 65  ->zName, zIndexe
23860 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20 70  dBy); .        p
23870 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a  Idx=pIdx->pNext.
23880 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
23890 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71  pIdx ){.      sq
238a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
238b0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
238c0 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65  ndex: %s", zInde
238d0 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20 20  xedBy, 0);.     
238e0 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
238f0 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
23900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23910 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ROR;.    }.    p
23920 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20 3d  From->pIBIndex =
23930 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
23940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23950 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
23960 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
23970 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
23980 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
23990 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
239a0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
239b0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
239c0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
239d0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
239e0 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
239f0 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
23a00 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
23a10 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
23a20 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
23a30 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
23a40 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
23a50 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
23a60 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
23a70 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
23a80 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
23a90 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
23aa0 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
23ab0 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
23ac0 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
23ad0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
23ae0 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
23af0 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
23b00 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
23b10 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
23b20 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
23b30 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
23b40 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
23b50 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
23b60 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
23b70 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23b80 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
23b90 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
23ba0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
23bb0 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
23bc0 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
23bd0 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
23be0 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
23bf0 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
23c00 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
23c10 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
23c20 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
23c30 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
23c40 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
23c50 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
23c60 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
23c70 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
23c80 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
23c90 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
23ca0 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
23cb0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
23cc0 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
23cd0 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
23ce0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
23cf0 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
23d00 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
23d10 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
23d20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
23d30 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
23d40 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
23d50 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
23d60 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
23d70 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
23d80 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
23d90 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
23da0 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
23db0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
23dc0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23dd0 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
23de0 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
23df0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
23e00 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
23e10 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
23e20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
23e30 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23e40 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
23e50 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
23e60 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
23e70 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
23e80 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
23e90 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
23ea0 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
23eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
23ec0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
23ed0 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
23ee0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
23ef0 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
23f00 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
23f10 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
23f20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
23f30 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
23f40 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
23f50 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
23f60 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
23f70 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
23f80 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
23f90 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23fa0 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
23fb0 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
23fc0 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
23fd0 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
23fe0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
23ff0 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
24000 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
24010 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
24020 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
24030 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
24040 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
24050 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
24060 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
24070 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
24080 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
24090 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53 54  3Expr(db, TK_AST
240a0 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70 2d  ERISK, 0));.  p-
240b0 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
240c0 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
240d0 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
240e0 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
240f0 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
24100 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
24110 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
24120 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   0;.  p->pNext =
24130 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20 3d   0;.  p->pWith =
24140 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   0;.  p->selFlag
24150 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
24160 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  d;.  assert( (p-
24170 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
24180 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b 0a  onverted)==0 );.
24190 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
241a0 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a 20   SF_Converted;. 
241b0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
241c0 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e  Prior!=0 );.  pN
241d0 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ew->pPrior->pNex
241e0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77  t = pNew;.  pNew
241f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
24200 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
24210 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  0;.  return WRC_
24220 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
24230 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
24240 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  if the FROM clau
24250 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61  se term pFrom ha
24260 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66  s table-valued f
24270 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d  unction.** argum
24280 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65  ents.  If it doe
24290 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
242a0 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
242b0 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  rse and return.*
242c0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63  * non-zero, sinc
242d0 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61  e pFrom is not a
242e0 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74  llowed to be a t
242f0 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
24300 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
24310 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  int cannotBeFunc
24320 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
24330 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
24340 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
24350 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67  .  if( pFrom->fg
24360 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
24370 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
24380 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20  g(pParse, "'%s' 
24390 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f  is not a functio
243a0 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  n", pFrom->zName
243b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
243c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
243d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
243e0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
243f0 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68  * Argument pWith
24400 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e   (which may be N
24410 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  ULL) points to a
24420 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
24430 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20  nested .** WITH 
24440 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69  contexts, from i
24450 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73  nner to outermos
24460 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
24470 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a  identified by .*
24480 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
24490 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72  ement pItem is r
244a0 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74  eally a common-t
244b0 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20  able-expression 
244c0 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72  (CTE) .** then r
244d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
244e0 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e  to the CTE defin
244f0 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74  ition for that t
24500 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  able. Otherwise.
24510 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  ** return NULL..
24520 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e  **.** If a non-N
24530 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74  ULL value is ret
24540 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f  urned, set *ppCo
24550 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74  ntext to point t
24560 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62  o the With.** ob
24570 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65  ject that the re
24580 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e  turned CTE belon
24590 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  gs to..*/.static
245a0 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61   struct Cte *sea
245b0 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20  rchWith(.  With 
245c0 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
245d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
245e0 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20  rrent innermost 
245f0 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WITH clause */. 
24600 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
24610 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
24620 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
24630 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c  element to resol
24640 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70  ve */.  With **p
24650 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
24660 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
24670 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75  WITH clause retu
24680 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73  rn value belongs
24690 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73   to */.){.  cons
246a0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
246b0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
246c0 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
246d0 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
246e0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
246f0 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
24700 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
24710 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
24720 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
24730 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
24740 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
24750 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
24760 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
24770 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
24780 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74        *ppContext
24790 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
247a0 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b  return &p->a[i];
247b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
247c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
247d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54  eturn 0;.}../* T
247e0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
247f0 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74  r maintains a st
24800 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49  ack of active WI
24810 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69  TH clauses.** wi
24820 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  th the inner-mos
24830 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65  t WITH clause be
24840 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ing at the top o
24850 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
24860 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24870 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20  pushes the WITH 
24880 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73  clause passed as
24890 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
248a0 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  ment.** onto the
248b0 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
248c0 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  k. If argument b
248d0 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68  Free is true, th
248e0 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20  en this.** WITH 
248f0 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65  clause will neve
24900 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d  r be popped from
24910 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74   the stack. In t
24920 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73  his case it.** s
24930 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
24940 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61  long with the Pa
24950 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f  rse object. In o
24960 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e  ther cases, when
24970 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68  .** bFree==0, th
24980 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69  e With object wi
24990 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ll be freed alon
249a0 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43  g with the SELEC
249b0 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  T .** statement 
249c0 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73  with which it is
249d0 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a   associated..*/.
249e0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
249f0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
24a00 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c  se, With *pWith,
24a10 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73   u8 bFree){.  as
24a20 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c  sert( bFree==0 |
24a30 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  | (pParse->pWith
24a40 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70  ==0 && pParse->p
24a50 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29  WithToFree==0) )
24a60 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b  ;.  if( pWith ){
24a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24a80 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74  rse->pWith!=pWit
24a90 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h );.    pWith->
24aa0 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
24ab0 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
24ac0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
24ad0 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65  h;.    if( bFree
24ae0 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   ) pParse->pWith
24af0 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a  ToFree = pWith;.
24b00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
24b10 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
24b20 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46  s if argument pF
24b30 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20  rom refers to a 
24b40 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20  CTE declared by 
24b50 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73  .** a WITH claus
24b60 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63  e on the stack c
24b70 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69  urrently maintai
24b80 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ned by the parse
24b90 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75  r. And,.** if cu
24ba0 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69  rrently processi
24bb0 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73  ng a CTE express
24bc0 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20  ion, if it is a 
24bd0 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66  recursive.** ref
24be0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75  erence to the cu
24bf0 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rrent CTE..**.**
24c00 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20   If pFrom falls 
24c10 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74  into either of t
24c20 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65  he two categorie
24c30 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e  s above, pFrom->
24c40 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  pTab.** and othe
24c50 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70  r fields are pop
24c60 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  ulated according
24c70 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73  ly. The caller s
24c80 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28  hould check.** (
24c90 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20  pFrom->pTab!=0) 
24ca0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
24cb0 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75  ther or not a su
24cc0 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a  ccessful match.*
24cd0 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  * was found..**.
24ce0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
24cf0 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  t a match is fou
24d00 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  nd, SQLITE_OK is
24d10 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
24d20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
24d30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   If an error doe
24d40 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f  s occur, an erro
24d50 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f  r message is sto
24d60 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  red in the.** pa
24d70 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72  rser and some er
24d80 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74  ror code other t
24d90 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  han SQLITE_OK re
24da0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
24db0 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64  c int withExpand
24dc0 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c  (.  Walker *pWal
24dd0 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53  ker, .  struct S
24de0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
24df0 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  om.){.  Parse *p
24e00 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
24e10 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74  >pParse;.  sqlit
24e20 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
24e30 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74  >db;.  struct Ct
24e40 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20  e *pCte;        
24e50 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65         /* Matche
24e60 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69  d CTE (or NULL i
24e70 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20  f no match) */. 
24e80 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20   With *pWith;   
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ea0 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20   /* WITH clause 
24eb0 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67  that pCte belong
24ec0 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
24ed0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
24ee0 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73  0 );..  pCte = s
24ef0 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65  earchWith(pParse
24f00 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20  ->pWith, pFrom, 
24f10 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70  &pWith);.  if( p
24f20 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  Cte ){.    Table
24f30 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72   *pTab;.    Expr
24f40 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
24f50 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
24f60 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66      Select *pLef
24f70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
24f80 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53    /* Left-most S
24f90 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
24fa0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52  */.    int bMayR
24fb0 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20  ecursive;       
24fc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
24fd0 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20  compound joined 
24fe0 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a  by UNION [ALL] *
24ff0 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76  /.    With *pSav
25000 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  edWith;         
25010 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76      /* Initial v
25020 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e  alue of pParse->
25030 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pWith */..    /*
25040 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
25050 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74  r is non-NULL at
25060 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
25070 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c  n this is an ill
25080 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75  egal.    ** recu
25090 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
250a0 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61  to CTE pCte. Lea
250b0 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
250c0 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
250d0 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49  .    ** early. I
250e0 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  f pCte->zCteErr 
250f0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
25100 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  is is not a recu
25110 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e  rsive reference.
25120 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
25130 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20  case, proceed.  
25140 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  */.    if( pCte-
25150 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20  >zCteErr ){.    
25160 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
25170 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e  g(pParse, pCte->
25180 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a  zCteErr, pCte->z
25190 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
251a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
251b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
251c0 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
251d0 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
251e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
251f0 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65  ERROR;..    asse
25200 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
25210 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  =0 );.    pFrom-
25220 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73  >pTab = pTab = s
25230 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
25240 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
25250 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ble));.    if( p
25260 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
25270 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70  WRC_Abort;.    p
25280 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
25290 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  ;.    pTab->zNam
252a0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
252b0 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e  Dup(db, pCte->zN
252c0 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  ame);.    pTab->
252d0 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
252e0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
252f0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
25300 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
25310 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
25320 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
25330 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
25340 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65  l | TF_NoVisible
25350 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d  Rowid;.    pFrom
25360 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
25370 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
25380 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20   pCte->pSelect, 
25390 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  0);.    if( db->
253a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
253b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
253c0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  EM_BKPT;.    ass
253d0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
253e0 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
253f0 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
25400 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
25410 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
25420 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
25430 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
25440 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
25450 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
25460 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
25470 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
25480 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
25490 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
254a0 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
254b0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
254c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
254d0 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
254e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
254f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
25500 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
25510 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
25520 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
25530 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
25540 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
25550 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
25560 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
25570 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
25580 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
25590 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
255a0 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
255b0 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
255c0 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65    pItem->fg.isRe
255d0 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20  cursive = 1;.   
255e0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61         pTab->nTa
255f0 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  bRef++;.        
25600 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73    pSel->selFlags
25610 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65   |= SF_Recursive
25620 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25630 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
25640 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72  * Only one recur
25650 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
25660 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20  s permitted. */ 
25670 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
25680 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20  TabRef>2 ){.    
25690 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
256a0 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  g(.          pPa
256b0 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72  rse, "multiple r
256c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63  eferences to rec
256d0 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73  ursive table: %s
256e0 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20  ", pCte->zName. 
256f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65       );.      re
25700 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25710 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  R;.    }.    ass
25720 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52  ert( pTab->nTabR
25730 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20  ef==1 || .      
25740 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73 65        ((pSel->se
25750 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73  lFlags&SF_Recurs
25760 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54  ive) && pTab->nT
25770 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20  abRef==2 ));..  
25780 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
25790 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65  = "circular refe
257a0 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20  rence: %s";.    
257b0 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61  pSavedWith = pPa
257c0 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
257d0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
257e0 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
257f0 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
25800 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50        Select *pP
25810 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72  rior = pSel->pPr
25820 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ior;.      asser
25830 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68  t( pPrior->pWith
25840 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72  ==0 );.      pPr
25850 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65  ior->pWith = pSe
25860 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20  l->pWith;.      
25870 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
25880 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f  t(pWalker, pPrio
25890 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  r);.      pPrior
258a0 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20  ->pWith = 0;.   
258b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
258c0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
258d0 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
258e0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
258f0 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
25900 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
25910 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
25920 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
25930 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
25940 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
25950 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
25960 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
25970 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
25980 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  & pEList->nExpr!
25990 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45  =pCte->pCols->nE
259a0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
259b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
259c0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
259d0 20 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66   has %d values f
259e0 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a  or %d columns",.
259f0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65              pCte
25a00 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d  ->zName, pEList-
25a10 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43  >nExpr, pCte->pC
25a20 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20  ols->nExpr.     
25a30 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50     );.        pP
25a40 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
25a50 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20  avedWith;.      
25a60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25a70 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
25a80 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43       pEList = pC
25a90 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d  te->pCols;.    }
25aa0 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c  ..    sqlite3Col
25ab0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
25ac0 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
25ad0 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
25ae0 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
25af0 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
25b00 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e ){.      if( p
25b10 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sel->selFlags & 
25b20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
25b30 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43          pCte->zC
25b40 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c  teErr = "multipl
25b50 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
25b60 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20  rences: %s";.   
25b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25b80 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
25b90 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
25ba0 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
25bb0 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
25bc0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
25bd0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
25be0 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
25bf0 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45  .    pCte->zCteE
25c00 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72  rr = 0;.    pPar
25c10 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76  se->pWith = pSav
25c20 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72  edWith;.  }..  r
25c30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25c40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
25c50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
25c60 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  TE./*.** If the 
25c70 53 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73  SELECT passed as
25c80 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
25c90 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f  ment has an asso
25ca0 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20  ciated WITH .** 
25cb0 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66  clause, pop it f
25cc0 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74  rom the stack st
25cd0 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
25ce0 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
25cf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
25d00 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
25d10 20 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c   the xSelectCall
25d20 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b  back2() callback
25d30 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65   by.** sqlite3Se
25d40 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65  lectExpand() whe
25d50 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45  n walking a SELE
25d60 43 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c  CT tree to resol
25d70 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65  ve table.** name
25d80 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d  s and other FROM
25d90 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73   clause elements
25da0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
25db0 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28  d selectPopWith(
25dc0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
25dd0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
25de0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
25df0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
25e00 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41    if( OK_IF_ALWA
25e10 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e  YS_TRUE(pParse->
25e20 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50 72  pWith) && p->pPr
25e30 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  ior==0 ){.    Wi
25e40 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64  th *pWith = find
25e50 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57  Rightmost(p)->pW
25e60 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69  ith;.    if( pWi
25e70 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  th!=0 ){.      a
25e80 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
25e90 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20  With==pWith );. 
25ea0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
25eb0 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74  th = pWith->pOut
25ec0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  er;.    }.  }.}.
25ed0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65  #else.#define se
25ee0 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65  lectPopWith 0.#e
25ef0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
25f00 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61   routine is a Wa
25f10 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f  lker callback fo
25f20 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20  r "expanding" a 
25f30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
25f40 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22  ..** "Expanding"
25f50 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65   means to do the
25f60 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
25f70 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73  *    (1)  Make s
25f80 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  ure VDBE cursor 
25f90 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
25fa0 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76  n assigned to ev
25fb0 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65  ery.**         e
25fc0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52  lement of the FR
25fd0 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  OM clause..**.**
25fe0 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e      (2)  Fill in
25ff0 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61   the pTabList->a
26000 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69  [].pTab fields i
26010 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  n the SrcList th
26020 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  at .**         d
26030 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75  efines FROM clau
26040 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20  se.  When views 
26050 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52  appear in the FR
26060 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20  OM clause,.**   
26070 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c        fill pTabL
26080 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74  ist->a[].pSelect
26090 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
260a0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
260b0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
260c0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
260d0 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70  the view.  A cop
260e0 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65  y is made of the
260f0 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a   view's SELECT.*
26100 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  *         statem
26110 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  ent so that we c
26120 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79  an freely modify
26130 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20   or delete that 
26140 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
26150 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72       without wor
26160 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73  rying about mess
26170 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73 69  ing up the persi
26180 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61  stent representa
26190 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  tion.**         
261a0 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a  of the view..**.
261b0 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74  **    (3)  Add t
261c0 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52  erms to the WHER
261d0 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f  E clause to acco
261e0 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55  mmodate the NATU
261f0 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20  RAL keyword.**  
26200 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20         on joins 
26210 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55  and the ON and U
26220 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a  SING clause of j
26230 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  oins..**.**    (
26240 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73  4)  Scan the lis
26250 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  t of columns in 
26260 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 28  the result set (
26270 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a  pEList) looking.
26280 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20 69  **         for i
26290 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
262a0 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  "*" operator or 
262b0 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72  the TABLE.* oper
262c0 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  ator..**        
262d0 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e   If found, expan
262e0 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65  d each "*" to be
262f0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
26300 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20   every table.** 
26310 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c          and TABL
26320 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20  E.* to be every 
26330 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e  column in TABLE.
26340 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
26350 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
26360 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
26370 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
26380 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
26390 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
263a0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a  .  int i, j, k;.
263b0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
263c0 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
263d0 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
263e0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
263f0 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pFrom;.  sqlite3
26400 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
26410 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a  b;.  Expr *pE, *
26420 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a  pRight, *pExpr;.
26430 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d    u16 selFlags =
26440 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20   p->selFlags;.. 
26450 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
26460 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69  SF_Expanded;.  i
26470 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
26480 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75  led  ){.    retu
26490 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
264a0 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d  }.  if( NEVER(p-
264b0 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65  >pSrc==0) || (se
264c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
264d0 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20  nded)!=0 ){.    
264e0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
264f0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74  ;.  }.  pTabList
26500 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45   = p->pSrc;.  pE
26510 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
26520 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
26530 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70 57 69  WAYS_TRUE(p->pWi
26540 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  th) ){.    sqlit
26550 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
26560 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b  e, p->pWith, 0);
26570 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
26580 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
26590 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
265a0 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
265b0 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
265c0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
265d0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
265e0 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
265f0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
26600 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
26610 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
26620 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
26630 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
26640 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26650 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
26660 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
26670 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
26680 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
26690 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
266a0 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
266b0 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
266c0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
266d0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
266e0 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
266f0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
26700 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
26710 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
26720 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
26730 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
26740 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
26750 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e  sert( pFrom->fg.
26760 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
26770 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  | pFrom->pTab!=0
26780 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
26790 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
267a0 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
267b0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
267c0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e  >pTab==0 );.#ifn
267d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
267e0 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68  CTE.    if( with
267f0 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20  Expand(pWalker, 
26800 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
26810 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
26820 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  f( pFrom->pTab )
26830 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a   {} else.#endif.
26840 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
26850 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
26860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
26870 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
26880 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
26890 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
268a0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
268b0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
268c0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
268d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
268e0 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
268f0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26900 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
26910 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61     if( sqlite3Wa
26920 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
26930 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e  , pSel) ) return
26940 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
26950 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
26960 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
26970 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
26980 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
26990 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
269a0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
269b0 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
269c0 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
269d0 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
269e0 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
269f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
26a00 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
26a10 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  b, pFrom->zAlias
26a20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
26a30 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
26a40 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
26a50 69 6e 74 66 28 64 62 2c 20 22 73 75 62 71 75 65  intf(db, "subque
26a60 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70  ry_%p", (void*)p
26a70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
26a80 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
26a90 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
26aa0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
26ab0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  }.      sqlite3C
26ac0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
26ad0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
26ae0 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e  >pEList,&pTab->n
26af0 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29  Col,&pTab->aCol)
26b00 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50  ;.      pTab->iP
26b10 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Key = -1;.      
26b20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
26b30 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
26b40 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
26b50 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
26b60 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c       pTab->tabFl
26b70 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
26b80 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ral;.#endif.    
26b90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
26ba0 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  An ordinary tabl
26bb0 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69  e or view name i
26bc0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
26bd0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
26be0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
26bf0 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  0 );.      pFrom
26c00 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
26c10 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
26c20 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
26c30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20  , pFrom);.      
26c40 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
26c50 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
26c60 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
26c70 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20  nTabRef>=0xffff 
26c80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26c90 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
26ca0 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
26cb0 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
26cc0 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
26cd0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
26ce0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
26cf0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
26d00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
26d10 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26d20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
26d30 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
26d40 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28 70  if( !IsVirtual(p
26d50 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65  Tab) && cannotBe
26d60 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
26d70 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
26d80 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
26d90 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  ort;.      }.#if
26da0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
26db0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
26dc0 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f  defined (SQLITE_
26dd0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
26de0 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  E).      if( IsV
26df0 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20  irtual(pTab) || 
26e00 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
26e10 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f  .        i16 nCo
26e20 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  l;.        if( s
26e30 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
26e40 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
26e50 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20   pTab) ) return 
26e60 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
26e70 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
26e80 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
26e90 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70          pFrom->p
26ea0 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
26eb0 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
26ec0 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  ab->pSelect, 0);
26ed0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26ee0 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46  SelectSetName(pF
26ef0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54  rom->pSelect, pT
26f00 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
26f10 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d      nCol = pTab-
26f20 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
26f30 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  Tab->nCol = -1;.
26f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
26f50 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
26f60 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
26f70 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  t);.        pTab
26f80 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
26f90 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
26fa0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
26fb0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
26fc0 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
26fd0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
26fe0 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
26ff0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
27000 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
27010 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
27020 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
27030 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
27040 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
27050 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
27060 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
27070 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
27080 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
27090 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
270a0 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
270b0 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
270c0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
270d0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
270e0 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
270f0 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
27100 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
27110 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
27120 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
27130 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
27140 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
27150 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
27160 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
27170 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
27180 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
27190 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
271a0 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
271b0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
271c0 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f  ASTERISK operato
271d0 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
271e0 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
271f0 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20  the column.  ** 
27200 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  list.  The follo
27210 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68  wing code just h
27220 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  as to locate the
27230 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a   TK_ASTERISK.  *
27240 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  * expressions an
27250 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e  d expand each on
27260 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
27270 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a   all columns in.
27280 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e    ** all tables.
27290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
272a0 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
272b0 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
272c0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
272d0 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
272e0 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
272f0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
27300 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
27310 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
27320 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
27330 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
27340 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54  ( pE->op==TK_AST
27350 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20  ERISK ) break;. 
27360 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
27370 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
27380 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
27390 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
273a0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
273b0 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
273c0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
273d0 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
273e0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
273f0 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
27400 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72  TK_ASTERISK ) br
27410 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
27420 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
27430 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
27440 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
27450 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
27460 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
27470 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
27480 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
27490 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
274a0 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
274b0 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
274c0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
274d0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
274e0 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
274f0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
27500 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
27510 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
27520 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
27530 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
27540 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
27550 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
27560 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
27570 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
27580 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
27590 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
275a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275b0 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
275c0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
275d0 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66  ames)==0;..    f
275e0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
275f0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
27600 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70       pE = a[k].p
27610 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67  Expr;.      pRig
27620 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
27630 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27640 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
27650 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
27660 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
27670 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20  TK_ASTERISK.    
27680 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54     && (pE->op!=T
27690 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d  K_DOT || pRight-
276a0 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
276b0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
276c0 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69     /* This parti
276d0 63 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e  cular expression
276e0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
276f0 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20  o be expanded.. 
27700 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27710 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
27720 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
27730 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b  Parse, pNew, a[k
27740 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
27750 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
27760 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b          pNew->a[
27770 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a  pNew->nExpr-1].z
27780 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d  Name = a[k].zNam
27790 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
277a0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
277b0 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d  -1].zSpan = a[k]
277c0 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20  .zSpan;.        
277d0 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30    a[k].zName = 0
277e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d  ;.          a[k]
277f0 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20  .zSpan = 0;.    
27800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b      }.        a[
27810 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  k].pExpr = 0;.  
27820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27830 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65     /* This expre
27840 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f  ssion is a "*" o
27850 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e  r a "TABLE.*" an
27860 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  d needs to be.  
27870 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65        ** expande
27880 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  d. */.        in
27890 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b  t tableSeen = 0;
278a0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
278b0 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74  1 when TABLE mat
278c0 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ches */.        
278d0 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30  char *zTName = 0
278e0 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20  ;       /* text 
278f0 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45  of name of TABLE
27900 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
27910 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  pE->op==TK_DOT )
27920 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
27930 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30  rt( pE->pLeft!=0
27940 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
27950 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
27960 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74  operty(pE->pLeft
27970 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29  , EP_IntValue) )
27980 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61  ;.          zTNa
27990 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e  me = pE->pLeft->
279a0 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
279b0 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
279c0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
279d0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
279e0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
279f0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  From++){.       
27a00 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
27a10 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
27a20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
27a30 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSub = pFrom->pS
27a40 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20  elect;.         
27a50 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
27a60 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b  = pFrom->zAlias;
27a70 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
27a80 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61   char *zSchemaNa
27a90 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  me = 0;.        
27aa0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
27ab0 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d       if( zTabNam
27ac0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
27ad0 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70      zTabName = p
27ae0 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
27af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27b00 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
27b10 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a  Failed ) break;.
27b20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
27b30 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e  ub==0 || (pSub->
27b40 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
27b50 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a  stedFrom)==0 ){.
27b60 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
27b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27b80 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
27b90 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
27ba0 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29  TName, zTabName)
27bb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
27bc0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
27bd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27be0 20 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73           iDb = s
27bf0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
27c00 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
27c10 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
27c20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20      zSchemaName 
27c30 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61  = iDb>=0 ? db->a
27c40 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65  Db[iDb].zDbSName
27c50 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
27c60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
27c70 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
27c80 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
27c90 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
27ca0 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
27cb0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
27cc0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
27cd0 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
27ce0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
27cf0 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
27d00 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
27d10 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
27d20 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
27d30 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
27d40 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
27d50 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
27d60 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
27d70 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
27d80 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
27d90 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
27da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27db0 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27dd0 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
27de0 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
27df0 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
27e00 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
27e10 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
27e30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
27e40 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
27e50 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
27e60 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
27e70 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20  idden', omit it 
27e80 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65  from the expande
27e90 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
27ea0 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
27eb0 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45   unless the SELE
27ec0 43 54 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e  CT has the SF_In
27ed0 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20  cludeHidden.    
27ee0 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73          ** bit s
27ef0 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  et..            
27f00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
27f10 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
27f20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64  & SF_IncludeHidd
27f30 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  en)==0.         
27f40 20 20 20 20 26 26 20 49 73 48 69 64 64 65 6e 43      && IsHiddenC
27f50 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
27f60 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20  l[j]) .         
27f70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
27f80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27f90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27fa0 20 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65          tableSee
27fb0 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  n = 1;..        
27fc0 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a      if( i>0 && z
27fd0 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  TName==0 ){.    
27fe0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
27ff0 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  From->fg.jointyp
28000 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
28010 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
28020 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
28030 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
28040 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
28050 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
28060 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
28070 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
28080 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
28090 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
280a0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
280b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
280c0 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
280d0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
28100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28110 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
28120 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
28130 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
28140 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
28150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28160 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
28170 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
28180 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
28190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
281a0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
281b0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
281c0 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
281d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
281e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
281f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28210 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
28220 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
28230 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
28240 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
28250 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
28260 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
28270 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
28280 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
28290 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
282a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
282b0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
282d0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
282e0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
282f0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
28300 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
28310 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
28320 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
28330 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
28340 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63           if( zSc
28350 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20  hemaName ){.    
28360 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
28370 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
28380 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65  db, TK_ID, zSche
28390 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  maName);.       
283a0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
283b0 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
283c0 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
283d0 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  eft, pExpr);.   
283e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
283f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
28400 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ongNames ){.    
28410 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
28420 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  name = sqlite3MP
28430 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
28440 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61  ", zTabName, zNa
28450 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
28460 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a       zToFree = z
28470 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  Colname;.       
28480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28490 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
284a0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20            pExpr 
284b0 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
284c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
284d0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
284e0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
284f0 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70  (pParse, pNew, p
28500 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
28510 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49     sqlite3TokenI
28520 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a  nit(&sColname, z
28530 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
28540 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28550 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
28560 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
28570 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
28580 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
28590 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
285a0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
285b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
285c0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
285d0 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
285e0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
285f0 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
28600 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
28610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28620 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
28630 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
28640 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
28650 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
28670 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
28680 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
28690 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
286a0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
286b0 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
286c0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
286d0 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28700 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
28710 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
28720 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28730 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
28740 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
28750 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28760 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
28770 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
28780 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28790 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
287a0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
287b0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
287c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
287d0 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
287e0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
287f0 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
28800 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28810 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
28820 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
28830 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
28840 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
28850 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28860 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28870 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
28880 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
28890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
288a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
288b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
288c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
288d0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
288e0 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
288f0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
28900 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
28910 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
28920 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
28930 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
28940 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
28950 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28960 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
28970 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
28980 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
28990 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
289a0 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rt;.  }.#endif. 
289b0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
289c0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
289d0 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
289e0 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
289f0 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68  walker..**.** Wh
28a00 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
28a10 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45  is the Walker.xE
28a20 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
28a30 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
28a40 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20  s.** are walked 
28a50 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69  without any acti
28a60 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20  ons being taken 
28a70 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50  at each node.  P
28a80 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68  resumably,.** wh
28a90 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
28aa0 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b  is used for Walk
28ab0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
28ac0 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72   then .** Walker
28ad0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
28ae0 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f   is set to do so
28af0 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66  mething useful f
28b00 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62  or every .** sub
28b10 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72  query in the par
28b20 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74  ser tree..*/.int
28b30 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b   sqlite3ExprWalk
28b40 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  Noop(Walker *Not
28b50 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55  Used, Expr *NotU
28b60 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
28b70 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
28b80 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
28b90 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
28ba0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e  inue;.}../*.** N
28bb0 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72  o-op routine for
28bc0 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20   the parse-tree 
28bd0 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43  walker for SELEC
28be0 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  T statements..**
28bf0 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
28c00 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
28c10 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65  .int sqlite3Sele
28c20 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  ctWalkNoop(Walke
28c30 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65  r *NotUsed, Sele
28c40 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20  ct *NotUsed2){. 
28c50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28c60 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
28c70 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
28c80 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
28c90 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
28ca0 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61  G./*.** Always a
28cb0 73 73 65 72 74 2e 20 20 54 68 69 73 20 78 53 65  ssert.  This xSe
28cc0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d  lectCallback2 im
28cd0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f  plementation pro
28ce0 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ves that the.** 
28cf0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
28d00 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   is never invoke
28d10 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
28d20 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65  e3SelectWalkAsse
28d30 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  rt2(Walker *NotU
28d40 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74  sed, Select *Not
28d50 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
28d60 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
28d70 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
28d80 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d    assert( 0 );.}
28d90 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68  .#endif./*.** Th
28da0 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
28db0 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
28dc0 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
28dd0 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
28de0 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
28df0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
28e00 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
28e10 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
28e20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
28e30 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
28e40 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
28e50 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
28e60 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
28e70 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
28e80 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
28e90 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
28ea0 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
28eb0 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
28ec0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
28ed0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
28ee0 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
28ef0 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
28f00 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
28f10 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
28f20 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
28f30 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
28f40 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
28f50 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
28f60 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
28f70 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
28f80 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
28f90 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
28fa0 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
28fb0 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
28fc0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
28fd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
28fe0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
28ff0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29000 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
29010 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
29020 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
29030 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
29040 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
29050 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
29060 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54  ( OK_IF_ALWAYS_T
29070 52 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73 43  RUE(pParse->hasC
29080 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20 20  ompound) ){.    
29090 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
290a0 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  k = convertCompo
290b0 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
290c0 65 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65  ery;.    w.xSele
290d0 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b  ctCallback2 = 0;
290e0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
290f0 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
29100 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65  ct);.  }.  w.xSe
29110 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
29120 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
29130 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
29140 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57  ck2 = selectPopW
29150 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ith;.  sqlite3Wa
29160 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
29170 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  lect);.}...#ifnd
29180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
29190 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
291a0 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78  is is a Walker.x
291b0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63  SelectCallback c
291c0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
291d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70  sqlite3SelectTyp
291e0 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72  eInfo().** inter
291f0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  face..**.** For 
29200 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65  each FROM-clause
29210 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43   subquery, add C
29220 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20  olumn.zType and 
29230 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20  Column.zColl.** 
29240 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
29250 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
29260 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
29270 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
29280 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62  t.** of that sub
29290 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
292a0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
292b0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
292c0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
292d0 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
292e0 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61  ** by selectExpa
292f0 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74  nder() but the t
29300 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
29310 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61  n information wa
29320 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20  s omitted.** at 
29330 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75  that point becau
29340 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68  se identifiers h
29350 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ad not yet been 
29360 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a  resolved.  This.
29370 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
29380 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74  lled after ident
29390 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e  ifier resolution
293a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
293b0 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
293c0 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
293d0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
293e0 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
293f0 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
29400 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
29410 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
29420 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
29430 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
29440 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
29450 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61  _Resolved );.  a
29460 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
29470 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
29480 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  Info)==0 );.  p-
29490 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
294a0 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70  HasTypeInfo;.  p
294b0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
294c0 3e 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c  >pParse;.  pTabL
294d0 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
294e0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
294f0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
29500 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
29510 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
29520 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
29530 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
29540 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
29550 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61   );.    if( (pTa
29560 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
29570 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29  _Ephemeral)!=0 )
29580 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  {.      /* A sub
29590 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
295a0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
295b0 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53  ELECT */.      S
295c0 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46  elect *pSel = pF
295d0 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
295e0 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a      if( pSel ){.
295f0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
29600 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  Sel->pPrior ) pS
29610 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
29620 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  r;.        sqlit
29630 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
29640 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
29650 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
29660 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSel);.      }. 
29670 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
29680 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
29690 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
296a0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
296b0 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
296c0 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
296d0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
296e0 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
296f0 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
29700 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
29710 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
29720 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
29730 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
29740 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
29750 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
29760 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
29770 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29780 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
29790 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
297a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
297b0 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
297c0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
297d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
297e0 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c  lkNoop;.  w.xSel
297f0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
29800 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
29810 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
29820 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
29830 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
29840 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
29850 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
29860 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
29870 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
29880 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
29890 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
298a0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
298b0 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
298c0 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
298d0 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
298e0 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
298f0 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
29900 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
29910 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
29920 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
29930 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
29940 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
29950 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
29960 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
29970 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
29980 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
29990 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
299a0 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
299b0 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
299c0 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
299d0 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
299e0 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
299f0 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
29a00 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
29a10 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
29a20 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
29a30 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
29a40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
29a50 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
29a60 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
29a70 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
29a80 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
29a90 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
29aa0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
29ab0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
29ac0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
29ad0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
29ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29af0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29b00 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
29b10 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
29b20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
29b30 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
29b40 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
29b50 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 7c 7c   assert( p!=0 ||
29b60 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
29b70 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
29b80 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
29b90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
29ba0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73  turn;.  if( p->s
29bb0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
29bc0 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
29bd0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
29be0 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c  ctExpand(pParse,
29bf0 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   p);.  if( pPars
29c00 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
29c10 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
29c20 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
29c30 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
29c40 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
29c50 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
29c60 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
29c70 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
29c80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29c90 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
29ca0 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49  e3SelectAddTypeI
29cb0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  nfo(pParse, p);.
29cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
29cd0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
29ce0 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  umulator..**.** 
29cf0 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  The aggregate ac
29d00 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73  cumulator is a s
29d10 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  et of memory cel
29d20 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20  ls that hold.** 
29d30 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
29d40 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75  ults while calcu
29d50 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67  lating an aggreg
29d60 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ate.  This.** ro
29d70 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
29d80 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73  code that stores
29d90 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
29da0 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a   those memory.**
29db0 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
29dc0 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75  c void resetAccu
29dd0 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
29de0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
29df0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
29e00 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
29e10 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
29e20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
29e30 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69  func *pFunc;.  i
29e40 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e  nt nReg = pAggIn
29e50 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67  fo->nFunc + pAgg
29e60 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  Info->nColumn;. 
29e70 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72   if( nReg==0 ) r
29e80 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51  eturn;.#ifdef SQ
29e90 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
29ea0 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20  Verify that all 
29eb0 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72  AggInfo register
29ec0 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65  s are within the
29ed0 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64   range specified
29ee0 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f   by.  ** AggInfo
29ef0 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e  .mnReg..AggInfo.
29f00 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72  mxReg */.  asser
29f10 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66  t( nReg==pAggInf
29f20 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66  o->mxReg-pAggInf
29f30 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20  o->mnReg+1 );.  
29f40 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49  for(i=0; i<pAggI
29f50 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  nfo->nColumn; i+
29f60 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
29f70 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
29f80 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
29f90 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
29fa0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43   && pAggInfo->aC
29fb0 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67  ol[i].iMem<=pAgg
29fc0 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20  Info->mxReg );. 
29fd0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
29fe0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
29ff0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
2a000 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  t( pAggInfo->aFu
2a010 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67  nc[i].iMem>=pAgg
2a020 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20  Info->mnReg.    
2a030 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f       && pAggInfo
2a040 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c  ->aFunc[i].iMem<
2a050 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2a060 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
2a070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a080 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
2a090 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  , pAggInfo->mnRe
2a0a0 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g, pAggInfo->mxR
2a0b0 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63  eg);.  for(pFunc
2a0c0 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
2a0d0 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  , i=0; i<pAggInf
2a0e0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2a0f0 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Func++){.    if(
2a100 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
2a110 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
2a120 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
2a130 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
2a140 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
2a150 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
2a160 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
2a170 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
2a180 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
2a190 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
2a1a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2a1b0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2a1c0 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
2a1d0 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
2a1e0 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
2a1f0 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
2a200 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
2a210 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
2a220 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
2a230 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
2a240 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
2a250 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2a260 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
2a270 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  List, 0, 0);.   
2a280 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a290 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2a2a0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e  nEphemeral, pFun
2a2b0 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c  c->iDistinct, 0,
2a2c0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2a2e0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2a2f0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2a300 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2a310 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
2a320 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65  e OP_AggFinalize
2a330 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72   opcode for ever
2a340 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
2a350 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41  tion.** in the A
2a360 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ggInfo structure
2a370 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a380 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
2a390 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61  tions(Parse *pPa
2a3a0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
2a3b0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
2a3c0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2a3d0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
2a3e0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2a3f0 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d  nc *pF;.  for(i=
2a400 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
2a410 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
2a420 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2a430 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  F++){.    ExprLi
2a440 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
2a450 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
2a460 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2a470 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
2a480 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
2a490 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c  lect) );.    sql
2a4a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2a4b0 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
2a4c0 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
2a4d0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
2a4e0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
2a4f0 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70  dbeAppendP4(v, p
2a500 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e  F->pFunc, P4_FUN
2a510 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  CDEF);.  }.}../*
2a520 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61  .** Update the a
2a530 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72  ccumulator memor
2a540 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61  y cells for an a
2a550 67 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f  ggregate based o
2a560 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
2a570 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2a580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a590 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
2a5a0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
2a5b0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
2a5c0 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  nfo){.  Vdbe *v 
2a5d0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2a5e0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2a5f0 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e  regHit = 0;.  in
2a600 74 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20  t addrHitTest = 
2a610 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  0;.  struct AggI
2a620 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
2a630 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
2a640 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49  ol *pC;..  pAggI
2a650 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
2a660 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 1;.  for(i=0, 
2a670 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  pF=pAggInfo->aFu
2a680 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  nc; i<pAggInfo->
2a690 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b  nFunc; i++, pF++
2a6a0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ){.    int nArg;
2a6b0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78  .    int addrNex
2a6c0 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
2a6d0 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c  egAgg;.    ExprL
2a6e0 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d  ist *pList = pF-
2a6f0 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b  >pExpr->x.pList;
2a700 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
2a710 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46  prHasProperty(pF
2a720 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ->pExpr, EP_xIsS
2a730 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66  elect) );.    if
2a740 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
2a750 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
2a760 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
2a770 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
2a780 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2a790 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
2a7a0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
2a7b0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
2a7c0 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20  ist, regAgg, 0, 
2a7d0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
2a7e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a7f0 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
2a800 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
2a810 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
2a820 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
2a830 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
2a840 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2a850 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2a860 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d   testcase( nArg=
2a870 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20  =0 );  /* Error 
2a880 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20  condition */.   
2a890 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72     testcase( nAr
2a8a0 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f  g>1 );   /* Also
2a8b0 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
2a8c0 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
2a8d0 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73  pParse, pF->iDis
2a8e0 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c  tinct, addrNext,
2a8f0 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20   1, regAgg);.   
2a900 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70   }.    if( pF->p
2a910 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20  Func->funcFlags 
2a920 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45  & SQLITE_FUNC_NE
2a930 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20  EDCOLL ){.      
2a940 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
2a950 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   0;.      struct
2a960 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2a970 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74  pItem;.      int
2a980 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
2a990 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f  ( pList!=0 );  /
2a9a0 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46  * pList!=0 if pF
2a9b0 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44  ->pFunc has NEED
2a9c0 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f  COLL */.      fo
2a9d0 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(j=0, pItem=pLi
2a9e0 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26  st->a; !pColl &&
2a9f0 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49   j<nArg; j++, pI
2aa00 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2aa10 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
2aa20 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
2aa30 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  e, pItem->pExpr)
2aa40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2aa50 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
2aa60 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
2aa70 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
2aa80 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
2aa90 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30     if( regHit==0
2aaa0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41   && pAggInfo->nA
2aab0 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67  ccumulator ) reg
2aac0 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Hit = ++pParse->
2aad0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
2aae0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2aaf0 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67   OP_CollSeq, reg
2ab00 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Hit, 0, 0, (char
2ab10 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
2ab20 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LSEQ);.    }.   
2ab30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2ab40 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70  p3(v, OP_AggStep
2ab50 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  0, 0, regAgg, pF
2ab60 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c  ->iMem);.    sql
2ab70 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
2ab80 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50  (v, pF->pFunc, P
2ab90 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  4_FUNCDEF);.    
2aba0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2abb0 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29  eP5(v, (u8)nArg)
2abc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2abd0 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
2abe0 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
2abf0 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  Agg, nArg);.    
2ac00 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2ac10 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2ac20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
2ac30 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
2ac40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2ac50 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2ac60 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
2ac70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2ac80 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2ac90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
2aca0 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c   /* Before popul
2acb0 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  ating the accumu
2acc0 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c  lator registers,
2acd0 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   clear the colum
2ace0 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74  n cache..  ** Ot
2acf0 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20  herwise, if any 
2ad00 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  of the required 
2ad10 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72  column values ar
2ad20 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  e already presen
2ad30 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73  t .  ** in regis
2ad40 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70  ters, sqlite3Exp
2ad50 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20  rCode() may use 
2ad60 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79  OP_SCopy to copy
2ad70 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20   the value.  ** 
2ad80 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74  to pC->iMem. But
2ad90 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
2ada0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20   value is used, 
2adb0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67  the original reg
2adc0 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68  ister.  ** may h
2add0 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69  ave been used, i
2ade0 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20  nvalidating the 
2adf0 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65  underlying buffe
2ae00 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  r holding the.  
2ae10 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20  ** text or blob 
2ae20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65  value. See ticke
2ae30 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a  t [883034dcb5]..
2ae40 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65    **.  ** Anothe
2ae50 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64  r solution would
2ae60 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68   be to change th
2ae70 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20  e OP_SCopy used 
2ae80 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20  to copy cached. 
2ae90 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e   ** values to an
2aea0 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20   OP_Copy..  */. 
2aeb0 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20   if( regHit ){. 
2aec0 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d     addrHitTest =
2aed0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2aee0 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
2aef0 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Hit); VdbeCovera
2af00 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
2af10 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2af20 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
2af30 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
2af40 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
2af50 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2af60 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
2af70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2af80 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
2af90 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
2afa0 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
2afb0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
2afc0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2afd0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2afe0 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
2aff0 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
2b000 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2b010 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
2b020 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
2b030 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
2b040 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
2b050 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
2b060 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
2b070 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
2b080 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
2b090 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
2b0a0 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
2b0b0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2b0c0 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
2b0d0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2b0e0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2b0f0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2b100 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
2b110 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
2b120 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
2b130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
2b140 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
2b150 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
2b160 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
2b170 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
2b180 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
2b190 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
2b1a0 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
2b1b0 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
2b1c0 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d      int bCover =
2b1d0 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61   (pIdx!=0 && (Ha
2b1e0 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
2b1f0 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
2b200 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20  ex(pIdx)));.    
2b210 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c  char *zEqp = sql
2b220 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
2b230 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41  se->db, "SCAN TA
2b240 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20  BLE %s%s%s",.   
2b250 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
2b260 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
2b270 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52   ? " USING COVER
2b280 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22  ING INDEX " : ""
2b290 2c 0a 20 20 20 20 20 20 20 20 62 43 6f 76 65 72  ,.        bCover
2b2a0 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a   ? pIdx->zName :
2b2b0 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73   "".    );.    s
2b2c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2b2d0 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
2b2e0 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c  ->pVdbe, OP_Expl
2b2f0 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
2b300 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45  lectId, 0, 0, zE
2b310 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20  qp, P4_DYNAMIC. 
2b320 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
2b330 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
2b340 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
2b350 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
2b360 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63  ** Context objec
2b370 74 20 66 6f 72 20 68 61 76 69 6e 67 54 6f 57 68  t for havingToWh
2b380 65 72 65 45 78 70 72 43 62 28 29 2e 0a 2a 2f 0a  ereExprCb()..*/.
2b390 73 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57  struct HavingToW
2b3a0 68 65 72 65 43 74 78 20 7b 0a 20 20 45 78 70 72  hereCtx {.  Expr
2b3b0 20 2a 2a 70 70 57 68 65 72 65 3b 0a 20 20 45 78   **ppWhere;.  Ex
2b3c0 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
2b3d0 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  ;.};../*.** sqli
2b3e0 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 63 61  te3WalkExpr() ca
2b3f0 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 68  llback used by h
2b400 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29 2e 0a  avingToWhere()..
2b410 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 64  **.** If the nod
2b420 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  e passed to the 
2b430 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20 54 4b  callback is a TK
2b440 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74 75 72  _AND node, retur
2b450 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74 69 6e  n .** WRC_Contin
2b460 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c 69 74  ue to tell sqlit
2b470 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74 6f 20  e3WalkExpr() to 
2b480 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2b490 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2a 0a  child nodes..**.
2b4a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
2b4b0 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 2e 20  turn WRC_Prune. 
2b4c0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 6c  In this case, al
2b4d0 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  so check if the 
2b4e0 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73 73 69  .** sub-expressi
2b4f0 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  on matches the c
2b500 72 69 74 65 72 69 61 20 66 6f 72 20 62 65 69 6e  riteria for bein
2b510 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 57  g moved to the W
2b520 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  HERE.** clause. 
2b530 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20 74 6f  If so, add it to
2b540 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2b550 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 74 68  e and replace th
2b560 65 20 73 75 62 2d 65 78 70 72 65 73 73 69 6f 6e  e sub-expression
2b570 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 48  .** within the H
2b580 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2b590 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61 6e 74   with a constant
2b5a0 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   "1"..*/.static 
2b5b0 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68 65 72  int havingToWher
2b5c0 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a  eExprCb(Walker *
2b5d0 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
2b5e0 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78  Expr){.  if( pEx
2b5f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29  pr->op!=TK_AND )
2b600 7b 0a 20 20 20 20 73 74 72 75 63 74 20 48 61 76  {.    struct Hav
2b610 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20 2a 70  ingToWhereCtx *p
2b620 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 48   = pWalker->u.pH
2b630 61 76 69 6e 67 43 74 78 3b 0a 20 20 20 20 69 66  avingCtx;.    if
2b640 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
2b650 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79  onstantOrGroupBy
2b660 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  (pWalker->pParse
2b670 2c 20 70 45 78 70 72 2c 20 70 2d 3e 70 47 72 6f  , pExpr, p->pGro
2b680 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73  upBy) ){.      s
2b690 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61  qlite3 *db = pWa
2b6a0 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62  lker->pParse->db
2b6b0 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  ;.      Expr *pN
2b6c0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2b6d0 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
2b6e0 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
2b6f0 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a  tTokens[1], 0);.
2b700 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
2b710 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
2b720 70 57 68 65 72 65 20 3d 20 2a 28 70 2d 3e 70 70  pWhere = *(p->pp
2b730 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
2b740 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65 77  SWAP(Expr, *pNew
2b750 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20 20  , *pExpr);.     
2b760 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
2b770 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68  3ExprAnd(db, pWh
2b780 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
2b790 20 20 20 20 2a 28 70 2d 3e 70 70 57 68 65 72 65      *(p->ppWhere
2b7a0 29 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ) = pNew;.      
2b7b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
2b7c0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
2b7d0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
2b7e0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
2b7f0 2a 20 54 72 61 6e 73 66 65 72 20 65 6c 69 67 69  * Transfer eligi
2b800 62 6c 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  ble terms from t
2b810 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2b820 20 6f 66 20 61 20 71 75 65 72 79 2c 20 77 68 69   of a query, whi
2b830 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63 65 73 73  ch is.** process
2b840 65 64 20 61 66 74 65 72 20 67 72 6f 75 70 69 6e  ed after groupin
2b850 67 2c 20 74 6f 20 74 68 65 20 57 48 45 52 45 20  g, to the WHERE 
2b860 63 6c 61 75 73 65 2c 20 77 68 69 63 68 20 69 73  clause, which is
2b870 20 70 72 6f 63 65 73 73 65 64 20 62 65 66 6f 72   processed befor
2b880 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67 2e 20 46  e.** grouping. F
2b890 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
2b8a0 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53  query:.**.**   S
2b8b0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61  ELECT * FROM <ta
2b8c0 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20  bles> WHERE a=? 
2b8d0 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e  GROUP BY b HAVIN
2b8e0 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a  G b=? AND c=?.**
2b8f0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69  .** can be rewri
2b900 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
2b910 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 3c   SELECT * FROM <
2b920 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61 3d  tables> WHERE a=
2b930 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f 55 50 20  ? AND b=? GROUP 
2b940 42 59 20 62 20 48 41 56 49 4e 47 20 63 3d 3f 0a  BY b HAVING c=?.
2b950 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20 6f 66 20  **.** A term of 
2b960 74 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65  the HAVING expre
2b970 73 73 69 6f 6e 20 69 73 20 65 6c 69 67 69 62 6c  ssion is eligibl
2b980 65 20 66 6f 72 20 74 72 61 6e 73 66 65 72 20 69  e for transfer i
2b990 66 20 69 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  f it consists.**
2b9a0 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 63 6f 6e   entirely of con
2b9b0 73 74 61 6e 74 73 20 61 6e 64 20 65 78 70 72 65  stants and expre
2b9c0 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
2b9d0 61 6c 73 6f 20 47 52 4f 55 50 20 42 59 20 74 65  also GROUP BY te
2b9e0 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75 73 65 20  rms that.** use 
2b9f0 74 68 65 20 22 42 49 4e 41 52 59 22 20 63 6f 6c  the "BINARY" col
2ba00 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e  lation sequence.
2ba10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2ba20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 0a 20  havingToWhere(. 
2ba30 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a   Parse *pParse,.
2ba40 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
2ba50 75 70 42 79 2c 0a 20 20 45 78 70 72 20 2a 70 48  upBy,.  Expr *pH
2ba60 61 76 69 6e 67 2c 20 0a 20 20 45 78 70 72 20 2a  aving, .  Expr *
2ba70 2a 70 70 57 68 65 72 65 0a 29 7b 0a 20 20 73 74  *ppWhere.){.  st
2ba80 72 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68 65  ruct HavingToWhe
2ba90 72 65 43 74 78 20 73 43 74 78 3b 0a 20 20 57 61  reCtx sCtx;.  Wa
2baa0 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a 0a 20  lker sWalker;.. 
2bab0 20 73 43 74 78 2e 70 70 57 68 65 72 65 20 3d 20   sCtx.ppWhere = 
2bac0 70 70 57 68 65 72 65 3b 0a 20 20 73 43 74 78 2e  ppWhere;.  sCtx.
2bad0 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
2bae0 70 42 79 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  pBy;..  memset(&
2baf0 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65  sWalker, 0, size
2bb00 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20  of(sWalker));.  
2bb10 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d  sWalker.pParse =
2bb20 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b   pParse;.  sWalk
2bb30 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
2bb40 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65   = havingToWhere
2bb50 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65  ExprCb;.  sWalke
2bb60 72 2e 75 2e 70 48 61 76 69 6e 67 43 74 78 20 3d  r.u.pHavingCtx =
2bb70 20 26 73 43 74 78 3b 0a 20 20 73 71 6c 69 74 65   &sCtx;.  sqlite
2bb80 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b  3WalkExpr(&sWalk
2bb90 65 72 2c 20 70 48 61 76 69 6e 67 29 3b 0a 7d 0a  er, pHaving);.}.
2bba0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
2bbb0 73 65 65 20 69 66 20 74 68 65 20 70 54 68 69 73  see if the pThis
2bbc0 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69   entry of pTabLi
2bbd0 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69  st is a self-joi
2bbe0 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65  n of a prior vie
2bbf0 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20  w..** If it is, 
2bc00 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20  then return the 
2bc10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72  SrcList_item for
2bc20 20 74 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e   the prior view.
2bc30 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a    If it is not,.
2bc40 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30  ** then return 0
2bc50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
2bc60 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
2bc70 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28  *isSelfJoinView(
2bc80 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2bc90 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  List,           
2bca0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73 65  /* Search for se
2bcb0 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73  lf-joins in this
2bcc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
2bcd0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
2bce0 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f  _item *pThis   /
2bcf0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 72 69  * Search for pri
2bd00 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  or reference to 
2bd10 74 68 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f  this subquery */
2bd20 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
2bd30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
2bd40 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20  ;.  for(pItem = 
2bd50 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74  pTabList->a; pIt
2bd60 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b  em<pThis; pItem+
2bd70 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
2bd80 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20  m->pSelect==0 ) 
2bd90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2bda0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  ( pItem->fg.viaC
2bdb0 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69  oroutine ) conti
2bdc0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74  nue;.    if( pIt
2bdd0 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63  em->zName==0 ) c
2bde0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2bdf0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
2be00 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  (pItem->zDatabas
2be10 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61 62  e, pThis->zDatab
2be20 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ase)!=0 ) contin
2be30 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2be40 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65  te3_stricmp(pIte
2be50 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d  m->zName, pThis-
2be60 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e  >zName)!=0 ) con
2be70 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
2be80 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
2be90 65 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e(0, .          
2bea0 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e  pThis->pSelect->
2beb0 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 70  pWhere, pItem->p
2bec0 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20  Select->pWhere, 
2bed0 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  -1) .    ){.    
2bee0 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77 61    /* The view wa
2bef0 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73 6f  s modified by so
2bf00 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  me other optimiz
2bf10 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20 20  ation such as.  
2bf20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57      ** pushDownW
2bf30 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20  hereTerms() */. 
2bf40 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2bf50 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2bf60 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74  pItem;.  }.  ret
2bf70 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
2bf80 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
2bf90 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
2bfa0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
2bfb0 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71 75  o transform a qu
2bfc0 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ery of the form.
2bfd0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
2bfe0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53  count(*) FROM (S
2bff0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
2c000 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
2c010 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a   y FROM t2).**.*
2c020 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a  * Into this:.**.
2c030 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53 45  **    SELECT (SE
2c040 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2c050 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20 63  OM t1)+(SELECT c
2c060 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29  ount(*) FROM t2)
2c070 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73  .**.** The trans
2c080 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77  formation only w
2c090 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20 74  orks if all of t
2c0a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
2c0b0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
2c0c0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
2c0d0 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66  s a UNION ALL of
2c0e0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72   two or more ter
2c0f0 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72 65  ms.**   *  There
2c100 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20   is no WHERE or 
2c110 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49  GROUP BY or HAVI
2c120 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68  NG clauses on th
2c130 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20  e subqueries.** 
2c140 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20 71    *  The outer q
2c150 75 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65  uery is a simple
2c160 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20   count(*).**.** 
2c170 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2c180 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2c190 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a  is undertaken..*
2c1a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
2c1b0 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61  ntOfViewOptimiza
2c1c0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
2c1d0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2c1e0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20    Select *pSub, 
2c1f0 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20  *pPrior;.  Expr 
2c200 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a  *pExpr;.  Expr *
2c210 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65  pCount;.  sqlite
2c220 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d  3 *db;.  if( (p-
2c230 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2c240 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72  ggregate)==0 ) r
2c250 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68  eturn 0;   /* Th
2c260 69 73 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  is is an aggrega
2c270 74 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  te */.  if( p->p
2c280 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
2c290 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2c2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e            /* Sin
2c2b0 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  gle result colum
2c2c0 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20 70  n */.  pExpr = p
2c2d0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
2c2e0 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
2c2f0 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
2c300 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
2c310 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73  0;        /* Res
2c320 75 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ult is an aggreg
2c330 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ate */.  if( sql
2c340 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45 78  ite3_stricmp(pEx
2c350 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f  pr->u.zToken,"co
2c360 75 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 30  unt") ) return 0
2c370 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28 29  ;  /* Is count()
2c380 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
2c390 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72 65  >x.pList!=0 ) re
2c3a0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
2c3b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2c3c0 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20  be count(*) */. 
2c3d0 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53   if( p->pSrc->nS
2c3e0 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30  rc!=1 ) return 0
2c3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c400 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20     /* One table 
2c410 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70 53  in FROM  */.  pS
2c420 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
2c430 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66  0].pSelect;.  if
2c440 28 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74 75  ( pSub==0 ) retu
2c450 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c470 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20 61  /* The FROM is a
2c480 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
2c490 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  f( pSub->pPrior=
2c4a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4c0 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63 6f   /* Must be a co
2c4d0 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20 64  mpound ry */.  d
2c4e0 6f 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  o{.    if( pSub-
2c4f0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70  >op!=TK_ALL && p
2c500 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65  Sub->pPrior ) re
2c510 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74  turn 0;  /* Must
2c520 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f   be UNION ALL */
2c530 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
2c540 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30  Where ) return 0
2c550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c560 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45         /* No WHE
2c570 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  RE clause */.   
2c580 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
2c590 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2c5a0 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  te ) return 0;  
2c5b0 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67     /* Not an agg
2c5c0 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53  regate */.    pS
2c5d0 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f  ub = pSub->pPrio
2c5e0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c600 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20 63  /* Repeat over c
2c610 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77 68  ompound */.  }wh
2c620 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20  ile( pSub );..  
2c630 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
2c640 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20 69  his point then i
2c650 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f  t is OK to perfo
2c660 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d  rm the transform
2c670 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d  ation */..  db =
2c680 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
2c690 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20  Count = pExpr;. 
2c6a0 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53   pExpr = 0;.  pS
2c6b0 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
2c6c0 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d  0].pSelect;.  p-
2c6d0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
2c6e0 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ect = 0;.  sqlit
2c6f0 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
2c700 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20  db, p->pSrc);.  
2c710 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  p->pSrc = sqlite
2c720 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
2c730 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
2c740 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77  (*p->pSrc));.  w
2c750 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20 20  hile( pSub ){.  
2c760 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20    Expr *pTerm;. 
2c770 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75 62     pPrior = pSub
2c780 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 53  ->pPrior;.    pS
2c790 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a  ub->pPrior = 0;.
2c7a0 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74 20      pSub->pNext 
2c7b0 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73  = 0;.    pSub->s
2c7c0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2c7d0 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53 75  gregate;.    pSu
2c7e0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  b->selFlags &= ~
2c7f0 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20  SF_Compound;.   
2c800 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
2c810 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  w = 0;.    sqlit
2c820 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2c830 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
2c840 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  t);.    pTerm = 
2c850 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65 33  pPrior ? sqlite3
2c860 45 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f 75  ExprDup(db, pCou
2c870 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b  nt, 0) : pCount;
2c880 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69 73  .    pSub->pELis
2c890 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
2c8a0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
2c8b0 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  , 0, pTerm);.   
2c8c0 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   pTerm = sqlite3
2c8d0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2c8e0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a  _SELECT, 0, 0);.
2c8f0 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
2c900 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
2c910 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a  , pTerm, pSub);.
2c920 20 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30      if( pExpr==0
2c930 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20   ){.      pExpr 
2c940 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c  = pTerm;.    }el
2c950 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20  se{.      pExpr 
2c960 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2c970 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20  Parse, TK_PLUS, 
2c980 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20  pTerm, pExpr);. 
2c990 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d 20     }.    pSub = 
2c9a0 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d  pPrior;.  }.  p-
2c9b0 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
2c9c0 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70  xpr = pExpr;.  p
2c9d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2c9e0 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23 69  F_Aggregate;..#i
2c9f0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2ca00 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
2ca10 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2ca20 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45   0x400 ){.    SE
2ca30 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
2ca40 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72  pParse,p,("After
2ca50 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f   count-of-view o
2ca60 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29  ptimization:\n")
2ca70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2ca80 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2ca90 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2caa0 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  f.  return 1;.}.
2cab0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2cac0 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
2cad0 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a  IMIZATION */../*
2cae0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
2caf0 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
2cb00 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
2cb10 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
2cb20 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
2cb30 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
2cb40 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
2cb50 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
2cb60 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
2cb70 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
2cb80 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
2cb90 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
2cba0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
2cbb0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
2cbc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2cbd0 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
2cbe0 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
2cbf0 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
2cc00 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
2cc10 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
2cc20 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
2cc30 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
2cc40 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2cc50 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
2cc60 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
2cc70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
2cc80 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
2cc90 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
2cca0 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
2ccb0 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
2ccc0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2ccd0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
2cce0 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
2ccf0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
2cd00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
2cd10 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
2cd20 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
2cd30 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
2cd40 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
2cd50 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
2cd60 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
2cd70 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
2cd80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2cd90 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
2cda0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
2cdb0 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
2cdc0 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
2cdd0 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
2cde0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
2cdf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2ce00 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
2ce10 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
2ce20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ce40 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
2ce50 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
2ce60 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
2ce70 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b  ist *pEList = 0;
2ce80 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
2ce90 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
2cea0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
2ceb0 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
2cec0 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
2ced0 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
2cee0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
2cef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2cf00 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2cf10 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2cf20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
2cf30 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47  pBy;    /* The G
2cf40 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
2cf50 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
2cf60 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b    Expr *pHaving;
2cf70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2cf80 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20  HAVING clause.  
2cf90 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
2cfa0 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
2cfb0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2cfc0 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
2cfd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
2cfe0 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
2cff0 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
2d000 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
2d010 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
2d020 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43  yword */.  SortC
2d030 74 78 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20  tx sSort;       
2d040 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77    /* Info on how
2d050 20 74 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44   to code the ORD
2d060 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
2d070 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e    AggInfo sAggIn
2d080 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f  fo;      /* Info
2d090 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20  rmation used by 
2d0a0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
2d0b0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b  s */.  int iEnd;
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d0d0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
2d0e0 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79  end of the query
2d0f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2d100 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
2d110 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
2d120 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e  nection */..#ifn
2d130 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d140 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52  EXPLAIN.  int iR
2d150 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d  estoreSelectId =
2d160 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
2d170 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53  Id;.  pParse->iS
2d180 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
2d190 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b  ->iNextSelectId+
2d1a0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20  +;.#endif..  db 
2d1b0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
2d1c0 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
2d1d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
2d1e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
2d1f0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2d200 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
2d210 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
2d220 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
2d230 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
2d240 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
2d250 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
2d260 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23  of(sAggInfo));.#
2d270 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2d280 4e 41 42 4c 45 44 0a 20 20 70 50 61 72 73 65 2d  NABLED.  pParse-
2d290 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b  >nSelectIndent++
2d2a0 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28  ;.  SELECTTRACE(
2d2b0 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62 65  1,pParse,p, ("be
2d2c0 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c  gin processing:\
2d2d0 6e 22 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  n"));.  if( sqli
2d2e0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2d2f0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71   0x100 ){.    sq
2d300 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2d310 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2d320 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
2d330 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2d340 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2d350 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st!=SRT_DistFifo
2d360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
2d370 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
2d380 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
2d390 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  T_Fifo );.  asse
2d3a0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2d3b0 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2d3c0 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st!=SRT_DistQueu
2d3d0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2d3e0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2d3f0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2d400 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66  RT_Queue );.  if
2d410 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
2d420 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2d430 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65   assert(pDest->e
2d440 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
2d450 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2d460 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a  ==SRT_Union || .
2d470 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2d480 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63  ->eDest==SRT_Exc
2d490 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ept || pDest->eD
2d4a0 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
2d4b0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
2d4c0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d4d0 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74  _Queue  || pDest
2d4e0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2d4f0 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20  tFifo ||.       
2d500 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
2d510 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
2d520 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
2d530 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20  =SRT_Fifo);.    
2d540 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
2d550 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
2d560 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
2d570 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
2d580 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
2d590 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
2d5a0 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
2d5b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2d5c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
2d5d0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
2d5e0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
2d5f0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
2d600 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
2d610 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
2d620 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
2d630 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65  , p, 0);.  memse
2d640 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a  t(&sSort, 0, siz
2d650 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20 73  eof(sSort));.  s
2d660 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
2d670 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
2d680 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2d690 63 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  c;.  if( pParse-
2d6a0 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
2d6b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2d6c0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2d6d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2d6e0 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  p->pEList!=0 );.
2d6f0 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
2d700 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2d710 65 67 61 74 65 29 21 3d 30 3b 0a 23 69 66 20 53  egate)!=0;.#if S
2d720 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2d730 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
2d740 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2d750 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  100 ){.    SELEC
2d760 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2d770 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72 20 6e  rse,p, ("after n
2d780 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c  ame resolution:\
2d790 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2d7a0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2d7b0 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2d7c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 74 20 61  ndif..  /* Get a
2d7d0 20 70 6f 69 6e 74 65 72 20 74 68 65 20 56 44 42   pointer the VDB
2d7e0 45 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  E under construc
2d7f0 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 69 6e 67  tion, allocating
2d800 20 61 20 6e 65 77 20 56 44 42 45 20 69 66 20 6f   a new VDBE if o
2d810 6e 65 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ne.  ** does not
2d820 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 2a   already exist *
2d830 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
2d840 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
2d850 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
2d860 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2d870 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
2d880 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
2d890 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
2d8a0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
2d8b0 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72  p);.  }..  /* Tr
2d8c0 79 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  y to flatten sub
2d8d0 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
2d8e0 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69 6e  ROM clause up in
2d8f0 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65 72  to the main quer
2d900 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  y.  */.#if !defi
2d910 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2d920 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
2d930 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2d940 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d  T_VIEW).  for(i=
2d950 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26  0; !p->pPrior &&
2d960 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2d970 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2d980 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2d990 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2d9a0 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2d9b0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
2d9c0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
2d9d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2d9e0 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
2d9f0 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63   if( pSub==0 ) c
2da00 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a  ontinue;..    /*
2da10 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63 68 20   Catch mismatch 
2da20 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65 64 20  in the declared 
2da30 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76 69 65  columns of a vie
2da40 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  w and the number
2da50 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d   of.    ** colum
2da60 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
2da70 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f 0a 20   on the RHS */. 
2da80 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
2da90 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  l!=pSub->pEList-
2daa0 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
2dab0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2dac0 70 50 61 72 73 65 2c 20 22 65 78 70 65 63 74 65  pParse, "expecte
2dad0 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72  d %d columns for
2dae0 20 27 25 73 27 20 62 75 74 20 67 6f 74 20 25 64   '%s' but got %d
2daf0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2db00 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
2db10 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Col, pTab->zName
2db20 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
2db30 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 67 6f  nExpr);.      go
2db40 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2db50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
2db60 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c 61 74 74  not try to flatt
2db70 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  en an aggregate 
2db80 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
2db90 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69  .    ** Flatteni
2dba0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  ng an aggregate 
2dbb0 73 75 62 71 75 65 72 79 20 69 73 20 6f 6e 6c 79  subquery is only
2dbc0 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65   possible if the
2dbd0 20 6f 75 74 65 72 20 71 75 65 72 79 0a 20 20 20   outer query.   
2dbe0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69   ** is not a joi
2dbf0 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  n.  But if the o
2dc00 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
2dc10 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  t a join, then t
2dc20 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
2dc30 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  ** will be imple
2dc40 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
2dc50 6f 75 74 69 6e 65 20 61 6e 64 20 74 68 65 72 65  outine and there
2dc60 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61 67 65   is no advantage
2dc70 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74   to.    ** flatt
2dc80 65 6e 69 6e 67 20 69 6e 20 74 68 61 74 20 63 61  ening in that ca
2dc90 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
2dca0 66 28 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61  f( (pSub->selFla
2dcb0 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2dcc0 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  e)!=0 ) continue
2dcd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
2dce0 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  ub->pGroupBy==0 
2dcf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2dd00 65 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61  e subquery conta
2dd10 69 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ins an ORDER BY 
2dd20 63 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20  clause and if.  
2dd30 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20    ** it will be 
2dd40 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
2dd50 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65   co-routine, the
2dd60 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
2dd70 2e 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72  .  This.    ** r
2dd80 65 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77  estriction allow
2dd90 73 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73  s SQL constructs
2dda0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
2ddb0 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
2ddc0 54 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  T expensive_func
2ddd0 74 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20  tion(x).    **  
2dde0 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78    FROM (SELECT x
2ddf0 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20   FROM tab ORDER 
2de00 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a  BY y LIMIT 10);.
2de10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2de20 65 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63  e expensive_func
2de30 74 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63  tion() is only c
2de40 6f 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31  omputed on the 1
2de50 30 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20  0 rows that.    
2de60 2a 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72  ** are output, r
2de70 61 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79  ather than every
2de80 20 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c   row of the tabl
2de90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2dea0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
2deb0 21 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30  !=0.     && i==0
2dec0 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69  .     && (pTabLi
2ded0 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
2dee0 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73       || (pTabLis
2def0 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74  t->a[1].fg.joint
2df00 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ype&(JT_LEFT|JT_
2df10 43 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20  CROSS))!=0).    
2df20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
2df30 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
2df40 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  ( flattenSubquer
2df50 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20  y(pParse, p, i, 
2df60 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  isAgg) ){.      
2df70 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
2df80 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
2df90 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
2dfa0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 2d  . */.      i = -
2dfb0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  1;.    }.    pTa
2dfc0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
2dfd0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2dfe0 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2dff0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2e000 20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f   if( !IgnorableO
2e010 72 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b  rderby(pDest) ){
2e020 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72  .      sSort.pOr
2e030 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
2e040 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  rBy;.    }.  }.#
2e050 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
2e060 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
2e070 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20  UND_SELECT.  /* 
2e080 48 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20  Handle compound 
2e090 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2e0a0 73 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61  s using the sepa
2e0b0 72 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74  rate multiSelect
2e0c0 28 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72  ().  ** procedur
2e0d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e..  */.  if( p-
2e0e0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72  >pPrior ){.    r
2e0f0 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  c = multiSelect(
2e100 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
2e110 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65  );.    explainSe
2e120 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
2e130 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
2e140 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23  toreSelectId);.#
2e150 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
2e160 4e 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43  NABLED.    SELEC
2e170 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2e180 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64  p,("end compound
2e190 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69  -select processi
2e1a0 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61  ng\n"));.    pPa
2e1b0 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65  rse->nSelectInde
2e1c0 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt--;.#endif.   
2e1d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2e1e0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72  #endif..  /* For
2e1f0 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68   each term in th
2e200 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64  e FROM clause, d
2e210 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20  o two things:.  
2e220 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65  ** (1) Authorize
2e230 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74  d unreferenced t
2e240 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47  ables.  ** (2) G
2e250 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2e260 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73   all sub-queries
2e270 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
2e280 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2e290 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2e2a0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2e2b0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2e2c0 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2e2d0 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
2e2e0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
2e2f0 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
2e300 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2e310 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2e320 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2e330 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  W).    const cha
2e340 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e  r *zSavedAuthCon
2e350 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  text;.#endif..  
2e360 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54    /* Issue SQLIT
2e370 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61  E_READ authoriza
2e380 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b  tions with a fak
2e390 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f  e column name fo
2e3a0 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62  r any.    ** tab
2e3b0 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65 66  les that are ref
2e3c0 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d  erenced but from
2e3d0 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73   which no values
2e3e0 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a   are extracted..
2e3f0 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20      ** Examples 
2e400 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20 6b  of where these k
2e410 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c  inds of null SQL
2e420 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69  ITE_READ authori
2e430 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77  zations.    ** w
2e440 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20  ould occur:.    
2e450 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
2e460 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2e470 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49  OM t1;   -- SQLI
2e480 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20  TE_READ t1."".  
2e490 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
2e4a0 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  t1.* FROM t1, t2
2e4b0 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45  ;   -- SQLITE_RE
2e4c0 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a  AD t2."".    **.
2e4d0 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20      ** The fake 
2e4e0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61  column name is a
2e4f0 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
2e500 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
2e510 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20  for a table to. 
2e520 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c     ** have a col
2e530 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65  umn named by the
2e540 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69   empty string, i
2e550 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65  n which case the
2e560 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a  re is no way to.
2e570 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69      ** distingui
2e580 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e  sh between an un
2e590 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
2e5a0 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72   and an actual r
2e5b0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a  eference to the.
2e5c0 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e      ** "" column
2e5d0 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  . The original d
2e5e0 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68  esign was for th
2e5f0 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
2e600 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c  me to be a NULL,
2e610 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f  .    ** which wo
2e620 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f  uld be unambiguo
2e630 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20  us.  But legacy 
2e640 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61  authorization ca
2e650 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20  llbacks might.  
2e660 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20    ** assume the 
2e670 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e  column name is n
2e680 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66  on-NULL and segf
2e690 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f  ault.  The use o
2e6a0 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a  f an empty.    *
2e6b0 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  * string for the
2e6c0 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
2e6d0 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20  e seems safer.. 
2e6e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49     */.    if( pI
2e6f0 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20  tem->colUsed==0 
2e700 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2e710 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
2e720 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70  , SQLITE_READ, p
2e730 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c  Item->zName, "",
2e740 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
2e750 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  e);.    }..#if !
2e760 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2e770 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2e780 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2e790 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20  _OMIT_VIEW).    
2e7a0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2e7b0 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
2e7c0 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ries in the FROM
2e7d0 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20   clause.    */. 
2e7e0 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d     pSub = pItem-
2e7f0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66  >pSelect;.    if
2e800 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2e810 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
2e820 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
2e830 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
2e840 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
2e850 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
2e860 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
2e870 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
2e880 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2e890 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
2e8a0 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
2e8b0 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
2e8c0 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
2e8d0 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
2e8e0 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
2e8f0 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
2e900 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
2e910 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
2e920 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
2e930 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
2e940 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
2e950 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
2e960 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
2e970 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
2e980 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
2e990 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
2e9a0 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
2e9b0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
2e9c0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2e9d0 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65  >fg.viaCoroutine
2e9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
2e9f0 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65  * The subroutine
2ea00 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20   that manifests 
2ea10 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20 62  the view might b
2ea20 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75  e a one-time rou
2ea30 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  tine,.        **
2ea40 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65   or it might nee
2ea50 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e  d to be rerun on
2ea60 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   each iteration 
2ea70 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20  because it.     
2ea80 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20     ** encodes a 
2ea90 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75  correlated subqu
2eaa0 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ery. */.        
2eab0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
2eac0 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49  3VdbeGetOp(v, pI
2ead0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2eae0 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e  )->opcode==OP_On
2eaf0 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ce );.        sq
2eb00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2eb10 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
2eb20 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
2eb30 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2eb40 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
2eb50 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2eb60 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
2eb70 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
2eb80 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
2eb90 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
2eba0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2ebb0 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
2ebc0 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
2ebd0 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
2ebe0 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
2ebf0 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
2ec00 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2ec10 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
2ec20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
2ec30 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
2ec40 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
2ec50 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
2ec60 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
2ec70 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
2ec80 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
2ec90 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
2eca0 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
2ecb0 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
2ecc0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
2ecd0 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
2ece0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2ecf0 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
2ed00 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
2ed10 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d   constant WHERE-
2ed20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20  clause terms in 
2ed30 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
2ed40 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69  down.    ** insi
2ed50 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  de the subquery.
2ed60 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20    This can help 
2ed70 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
2ed80 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65  run more efficie
2ed90 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ntly..    */.   
2eda0 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e   if( (pItem->fg.
2edb0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
2edc0 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  TER)==0.     && 
2edd0 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
2ede0 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ms(pParse, pSub,
2edf0 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
2ee00 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20  m->iCursor).    
2ee10 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
2ee20 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
2ee30 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2ee40 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2ee50 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  ){.        SELEC
2ee60 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2ee70 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48  rse,p,("After WH
2ee80 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d  ERE-clause push-
2ee90 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  down:\n"));.    
2eea0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2eeb0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2eec0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
2eed0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53  if.    }..    zS
2eee0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
2eef0 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
2ef00 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61 72  ontext;.    pPar
2ef10 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
2ef20 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b   = pItem->zName;
2ef30 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
2ef40 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d  e code to implem
2ef50 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72 79  ent the subquery
2ef60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2ef70 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 69  he subquery is i
2ef80 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
2ef90 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74 68  co-routine if th
2efa0 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20 20  e subquery is.  
2efb0 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
2efc0 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72 20  to be the outer 
2efd0 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69 74  loop (so that it
2efe0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2eff0 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  o be.    ** comp
2f000 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f  uted more than o
2f010 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nce).    **.    
2f020 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68 65  ** TODO: Are the
2f030 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 73  re other reasons
2f040 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20 75   beside (1) to u
2f050 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a  se a co-routine.
2f060 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
2f070 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20  ation?.    */.  
2f080 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20 20    if( i==0.     
2f090 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
2f0a0 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20  rc==1.          
2f0b0 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e    || (pTabList->
2f0c0 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[1].fg.jointype
2f0d0 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f  &(JT_LEFT|JT_CRO
2f0e0 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31 29  SS))!=0)  /* (1)
2f0f0 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   */.    ){.     
2f100 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20   /* Implement a 
2f110 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
2f120 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69  will return a si
2f130 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2f140 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2f150 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f  set on each invo
2f160 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  cation..      */
2f170 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
2f180 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2f190 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31  CurrentAddr(v)+1
2f1a0 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70 49  ;.     .      pI
2f1b0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
2f1c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2f1d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f1e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
2f1f0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  nitCoroutine, pI
2f200 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
2f210 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20  0, addrTop);.   
2f220 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2f230 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e  v, "%s", pItem->
2f240 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2f250 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
2f260 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f  FillSub = addrTo
2f270 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
2f280 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
2f290 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74  dest, SRT_Corout
2f2a0 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2f2b0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78  eturn);.      ex
2f2c0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2f2d0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2f2e0 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
2f2f0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
2f300 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
2f310 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
2f320 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
2f330 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
2f340 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
2f350 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
2f360 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
2f370 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  outine = 1;.    
2f380 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75    pItem->regResu
2f390 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  lt = dest.iSdst;
2f3a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2f3b0 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
2f3c0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2f3d0 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
2f3e0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
2f3f0 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
2f400 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2f410 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2f420 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
2f430 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
2f440 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
2f450 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
2f460 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
2f470 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
2f480 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2f490 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
2f4a0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2f4b0 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
2f4c0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
2f4d0 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
2f4e0 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
2f4f0 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
2f500 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
2f510 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
2f520 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
2f530 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
2f540 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
2f550 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
2f560 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
2f570 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
2f580 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
2f590 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
2f5a0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72  rcList_item *pPr
2f5b0 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ior;..      asse
2f5c0 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
2f5d0 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
2f5e0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
2f5f0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
2f600 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
2f610 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2f620 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2f630 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
2f640 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2f650 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
2f660 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
2f670 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  1;.      if( pIt
2f680 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61  em->fg.isCorrela
2f690 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
2f6a0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
2f6b0 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72  uery is not corr
2f6c0 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
2f6d0 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
2f6e0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
2f6f0 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
2f700 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
2f710 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
2f720 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
2f730 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
2f740 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
2f750 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
2f760 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
2f770 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
2f780 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
2f790 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2f7a0 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
2f7b0 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
2f7c0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2f7d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f7e0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
2f7f0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
2f800 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
2f810 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
2f820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
2f830 72 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69  rior = isSelfJoi
2f840 6e 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20  nView(pTabList, 
2f850 70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  pItem);.      if
2f860 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ( pPrior ){.    
2f870 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2f880 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
2f890 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Dup, pItem->iCur
2f8a0 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75  sor, pPrior->iCu
2f8b0 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65  rsor);.        e
2f8c0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2f8d0 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
2f8e0 64 2c 20 70 50 72 69 6f 72 2d 3e 69 53 65 6c 65  d, pPrior->iSele
2f8f0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 61  ctId);.        a
2f900 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
2f910 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
2f920 20 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65       pSub->nSele
2f930 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
2f940 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74  pSelect->nSelect
2f950 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Row;.      }else
2f960 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f970 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
2f980 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
2f990 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
2f9a0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  sor);.        ex
2f9b0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2f9c0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2f9d0 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
2f9e0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
2f9f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2fa00 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
2fa10 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
2fa20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  }.      pItem->p
2fa30 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2fa40 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
2fa50 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ow;.      if( on
2fa60 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  ceAddr ) sqlite3
2fa70 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2fa80 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20  onceAddr);.     
2fa90 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74   retAddr = sqlit
2faa0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2fab0 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  OP_Return, pItem
2fac0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2fad0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2fae0 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
2faf0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2fb00 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2fb10 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
2fb20 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64   topAddr, retAdd
2fb30 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2fb40 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2fb50 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2fb60 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
2fb70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2fb80 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2fb90 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2fba0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
2fbb0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2fbc0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  .    pParse->zAu
2fbd0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
2fbe0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23  edAuthContext;.#
2fbf0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
2fc00 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73  Various elements
2fc10 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63   of the SELECT c
2fc20 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c  opied into local
2fc30 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20   variables for. 
2fc40 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20   ** convenience 
2fc50 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
2fc60 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72  >pEList;.  pWher
2fc70 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
2fc80 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
2fc90 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
2fca0 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
2fcb0 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
2fcc0 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
2fcd0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
2fce0 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43  )!=0;..#if SELEC
2fcf0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2fd00 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2fd10 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
2fd20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
2fd30 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
2fd40 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52  p,("After all FR
2fd50 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73  OM-clause analys
2fd60 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  is:\n"));.    sq
2fd70 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2fd80 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2fd90 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
2fda0 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
2fdb0 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
2fdc0 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
2fdd0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
2fde0 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
2fdf0 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e  ener|SQLITE_Coun
2fe00 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20 63  tOfView).   && c
2fe10 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
2fe20 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  zation(pParse, p
2fe30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ).  ){.    if( d
2fe40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2fe50 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2fe60 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  d;.    pEList = 
2fe70 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70  p->pEList;.    p
2fe80 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
2fe90 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
2fea0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
2feb0 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
2fec0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
2fed0 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
2fee0 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
2fef0 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
2ff00 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
2ff10 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
2ff20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
2ff30 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
2ff40 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
2ff50 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
2ff60 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
2ff70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
2ff80 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
2ff90 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
2ffa0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
2ffb0 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
2ffc0 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
2ffd0 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
2ffe0 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
2fff0 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79   xyz ORDER BY xy
30000 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  z.  **.  ** The 
30010 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70  second form is p
30020 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69  referred as a si
30030 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74  ngle index (or t
30040 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62  emp-table) may b
30050 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  e .  ** used for
30060 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20   both the ORDER 
30070 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
30080 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f  processing. As o
30090 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20  riginally .  ** 
300a0 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72  written the quer
300b0 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d  y must use a tem
300c0 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c  p-table for at l
300d0 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
300e0 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61  ORDER .  ** BY a
300f0 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64  nd DISTINCT, and
30100 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70   an index or sep
30110 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65  arate temp-table
30120 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a   for the other..
30130 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
30140 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
30150 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
30160 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
30170 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ct .   && sqlite
30180 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
30190 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c  (sSort.pOrderBy,
301a0 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a   pEList, -1)==0.
301b0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
301c0 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
301d0 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70  inct;.    pGroup
301e0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
301f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
30200 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  stDup(db, pEList
30210 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74  , 0);.    /* Not
30220 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ice that even th
30230 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63  ought SF_Distinc
30240 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  t has been clear
30250 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c  ed from p->selFl
30260 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ags,.    ** the 
30270 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
30280 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20   is still set.  
30290 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65  Hence, isTnct re
302a0 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20  presents the.   
302b0 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74   ** original set
302c0 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44  ting of the SF_D
302d0 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f  istinct flag, no
302e0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  t the current se
302f0 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73  tting */.    ass
30300 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69  ert( sDistinct.i
30310 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45  sTnct );..#if SE
30320 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
30330 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
30340 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
30350 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45  x400 ){.      SE
30360 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
30370 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73  pParse,p,("Trans
30380 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e  form DISTINCT in
30390 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29  to GROUP BY:\n")
303a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
303b0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
303c0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , p, 0);.    }.#
303d0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
303e0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
303f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
30400 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65  then create an e
30410 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
30420 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f  o.  ** do the so
30430 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73  rting.  But this
30440 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72   sorting ephemer
30450 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  al index might e
30460 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67  nd up.  ** being
30470 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
30480 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61  ata can be extra
30490 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
304a0 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49  ed order..  ** I
304b0 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
304c0 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f  se, then the OP_
304d0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
304e0 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
304f0 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74  e.  ** changed t
30500 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
30510 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  e we figure out 
30520 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
30530 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e   index is.  ** n
30540 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
30550 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
30560 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20  dex variable is 
30570 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
30580 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61  te.  ** that cha
30590 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
305a0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
305b0 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
305c0 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
305d0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
305e0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
305f0 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  se, sSort.pOrder
30600 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e  By, 0, pEList->n
30610 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74  Expr);.    sSort
30620 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  .iECursor = pPar
30630 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
30640 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
30650 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
30660 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
30670 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
30680 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f  l,.          sSo
30690 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f  rt.iECursor, sSo
306a0 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
306b0 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  pr+1+pEList->nEx
306c0 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
306d0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
306e0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20  , P4_KEYINFO.   
306f0 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
30700 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
30710 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
30720 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
30730 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
30740 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
30750 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
30760 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
30770 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
30780 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
30790 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
307a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
307b0 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
307c0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c  st->iSDParm, pEL
307d0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
307e0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
307f0 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
30800 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
30810 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
30820 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
30830 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
30840 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  t)==0 ){.    p->
30850 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30  nSelectRow = 320
30860 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20  ;  /* 4 billion 
30870 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f  rows */.  }.  co
30880 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
30890 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
308a0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
308b0 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72  Limit==0 && sSor
308c0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
308d0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
308e0 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
308f0 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  e(v, sSort.addrS
30900 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72  ortIndex, OP_Sor
30910 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53  terOpen);.    sS
30920 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d  ort.sortFlags |=
30930 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
30940 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ter;.  }..  /* O
30950 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  pen an ephemeral
30960 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
30970 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
30980 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
30990 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
309a0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
309b0 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
309c0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
309d0 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
309e0 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
309f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
30a00 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
30a10 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
30a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a30 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e   sDistinct.tabTn
30a40 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
30a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a60 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
30a70 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
30a80 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
30a90 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20  ist,0,0),.      
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ab0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
30ac0 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  O);.    sqlite3V
30ad0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42  dbeChangeP5(v, B
30ae0 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b  TREE_UNORDERED);
30af0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
30b00 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
30b10 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45  _DISTINCT_UNORDE
30b20 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  RED;.  }else{.  
30b30 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
30b40 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
30b50 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d  STINCT_NOOP;.  }
30b60 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26  ..  if( !isAgg &
30b70 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b  & pGroupBy==0 ){
30b80 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65  .    /* No aggre
30b90 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
30ba0 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  nd no GROUP BY c
30bb0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36  lause */.    u16
30bc0 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73   wctrlFlags = (s
30bd0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
30be0 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53  ? WHERE_WANT_DIS
30bf0 54 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20 20  TINCT : 0);.    
30c00 61 73 73 65 72 74 28 20 57 48 45 52 45 5f 55 53  assert( WHERE_US
30c10 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65  E_LIMIT==SF_Fixe
30c20 64 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 77 63  dLimit );.    wc
30c30 74 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e 73  trlFlags |= p->s
30c40 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78  elFlags & SF_Fix
30c50 65 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a  edLimit;..    /*
30c60 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
30c70 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ase scan. */.   
30c80 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
30c90 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
30ca0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
30cb0 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  here, sSort.pOrd
30cc0 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
30cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ce0 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20       p->pEList, 
30cf0 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e  wctrlFlags, p->n
30d00 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
30d10 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
30d20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
30d30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
30d40 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
30d50 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
30d60 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
30d70 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
30d80 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
30d90 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
30da0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
30db0 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
30dc0 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
30dd0 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
30de0 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
30df0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
30e00 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
30e10 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
30e20 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
30e30 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72     if( sSort.pOr
30e40 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
30e50 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71  Sort.nOBSat = sq
30e60 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
30e70 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  red(pWInfo);.   
30e80 20 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72 65     sSort.bOrdere
30e90 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71 6c  dInnerLoop = sql
30ea0 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 65 64  ite3WhereOrdered
30eb0 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66 6f  InnerLoop(pWInfo
30ec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f  );.      if( sSo
30ed0 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74  rt.nOBSat==sSort
30ee0 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
30ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72   ){.        sSor
30f00 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  t.pOrderBy = 0;.
30f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
30f20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67     /* If sorting
30f30 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20   index that was 
30f40 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69  created by a pri
30f50 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
30f60 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74  ral .    ** inst
30f70 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70  ruction ended up
30f80 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65   not being neede
30f90 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74  d, then change t
30fa0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
30fb0 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ral.    ** into 
30fc0 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20  an OP_Noop..    
30fd0 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74  */.    if( sSort
30fe0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
30ff0 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65  0 && sSort.pOrde
31000 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
31010 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
31020 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74  eToNoop(v, sSort
31030 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b  .addrSortIndex);
31040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
31050 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
31060 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
31070 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
31080 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a  List==pEList );.
31090 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
310a0 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d  oop(pParse, p, -
310b0 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73  1, &sSort, &sDis
310c0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310e0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f    sqlite3WhereCo
310f0 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e  ntinueLabel(pWIn
31100 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
31110 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31120 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
31130 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f  pWInfo));..    /
31140 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
31150 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
31160 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
31170 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
31180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
31190 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e  * This case when
311a0 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67   there exist agg
311b0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
311c0 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63   or a GROUP BY c
311d0 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20  lause.    ** or 
311e0 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  both */.    Name
311f0 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
31200 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
31210 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
31220 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
31230 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
31240 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
31250 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
31260 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
31270 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
31280 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
31290 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
312a0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
312b0 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
312c0 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
312d0 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
312e0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
312f0 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
31300 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
31310 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
31320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31330 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
31340 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
31350 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
31360 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
31370 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
31380 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
31390 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
313a0 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
313b0 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
313c0 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
313d0 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
313e0 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
313f0 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
31400 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
31410 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
31420 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
31430 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
31440 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  f processing for
31450 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
31460 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62      int sortPTab
31470 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64   = 0;   /* Pseud
31480 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64  otable used to d
31490 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65  ecode sorting re
314a0 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  sults */.    int
314b0 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20   sortOut = 0;   
314c0 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73   /* Output regis
314d0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ter from the sor
314e0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ter */.    int o
314f0 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f  rderByGrp = 0; /
31500 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47 52  * True if the GR
31510 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52  OUP BY and ORDER
31520 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d 65   BY are the same
31530 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   */..    /* Remo
31540 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61  ve any and all a
31550 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74  liases between t
31560 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e  he result set an
31570 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f  d the.    ** GRO
31580 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
31590 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
315a0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69  oupBy ){.      i
315b0 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  nt k;           
315c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
315d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
315e0 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
315f0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
31600 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  m;  /* For loopi
31610 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69  ng over expressi
31620 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a  on in a list */.
31630 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e  .      for(k=p->
31640 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
31650 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Item=p->pEList->
31660 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
31670 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
31680 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
31690 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
316a0 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70      for(k=pGroup
316b0 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  By->nExpr, pItem
316c0 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e  =pGroupBy->a; k>
316d0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
316e0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
316f0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
31700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
31710 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69 74  ssert( 66==sqlit
31720 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b  e3LogEst(100) );
31730 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
31740 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70 2d  electRow>66 ) p-
31750 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36 36  >nSelectRow = 66
31760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31770 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71     assert( 0==sq
31780 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
31790 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
317a0 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  ctRow = 0;.    }
317b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
317c0 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55  e is both a GROU
317d0 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45  P BY and an ORDE
317e0 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20  R BY clause and 
317f0 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20  they are.    ** 
31800 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20  identical, then 
31810 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62  it may be possib
31820 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  le to disable th
31830 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
31840 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  e .    ** on the
31850 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68   grounds that th
31860 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20  e GROUP BY will 
31870 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74  cause elements t
31880 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20  o come out .    
31890 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ** in the correc
318a0 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f  t order. It also
318b0 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47   may not - the G
318c0 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73  ROUP BY might us
318d0 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  e a.    ** datab
318e0 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63  ase index that c
318f0 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65  auses rows to be
31900 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
31910 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20  r as required.  
31920 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74    ** but not act
31930 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69  ually sorted. Ei
31940 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64  ther way, record
31950 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
31960 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20  he.    ** ORDER 
31970 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
31980 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20  clauses are the 
31990 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20  same by setting 
319a0 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20  the orderByGrp. 
319b0 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20     ** variable. 
319c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
319d0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
319e0 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f  re(pGroupBy, sSo
319f0 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  rt.pOrderBy, -1)
31a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  ==0 ){.      ord
31a10 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20  erByGrp = 1;.   
31a20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61   }. .    /* Crea
31a30 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
31a40 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
31a50 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
31a60 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
31a70 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
31a80 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
31a90 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
31aa0 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
31ab0 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
31ac0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
31ad0 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
31ae0 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
31af0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
31b00 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
31b10 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
31b20 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
31b30 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
31b40 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
31b50 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
31b60 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
31b70 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
31b80 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
31b90 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
31ba0 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
31bb0 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
31bc0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
31bd0 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
31be0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
31bf0 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
31c00 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
31c10 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
31c20 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
31c30 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
31c40 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
31c50 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
31c60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
31c70 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
31c80 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
31c90 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
31ca0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
31cb0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
31cc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31cd0 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65   pWhere==p->pWhe
31ce0 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 68 61  re );.        ha
31cf0 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61 72  vingToWhere(pPar
31d00 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 48  se, pGroupBy, pH
31d10 61 76 69 6e 67 2c 20 26 70 2d 3e 70 57 68 65 72  aving, &p->pWher
31d20 65 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65  e);.        pWhe
31d30 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
31d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
31d50 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
31d60 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c  Aggregates(&sNC,
31d70 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d   pHaving);.    }
31d80 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41  .    sAggInfo.nA
31d90 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67  ccumulator = sAg
31da0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20  gInfo.nColumn;. 
31db0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
31dc0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
31dd0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
31de0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
31df0 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
31e00 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
31e10 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
31e20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
31e30 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a  = NC_InAggFunc;.
31e40 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
31e50 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
31e60 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
31e70 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
31e80 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  .pList);.      s
31e90 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
31ea0 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
31eb0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
31ec0 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mxReg = pParse->
31ed0 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62  nMem;.    if( db
31ee0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
31ef0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
31f00 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
31f10 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
31f20 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
31f30 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
31f40 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
31f50 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
31f60 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
31f70 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
31f80 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
31f90 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
31fa0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
31fb0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
31fc0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
31fd0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
31fe0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
31ff0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
32000 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
32010 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
32020 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
32030 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
32040 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
32050 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
32060 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
32070 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
32080 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
32090 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
320a0 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
320b0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
320c0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
320d0 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
320e0 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
320f0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
32100 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
32110 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
32120 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
32130 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
32140 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
32150 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
32160 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
32170 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
32180 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
32190 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
321a0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
321b0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
321c0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
321d0 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
321e0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
321f0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
32200 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
32210 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
32220 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
32230 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
32240 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
32250 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
32260 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
32270 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
32280 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
32290 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
322a0 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
322b0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
322c0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
322d0 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
322e0 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
322f0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
32300 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
32310 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
32320 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
32330 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
32340 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
32350 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
32360 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
32370 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
32380 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66  upBy, 0, sAggInf
32390 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  o.nColumn);.    
323a0 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
323b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
323c0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
323d0 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  rOpen, .        
323e0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
323f0 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
32400 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
32410 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
32420 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
32430 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20  4_KEYINFO);..   
32440 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
32450 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
32460 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
32470 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
32480 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
32490 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
324a0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
324b0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
324c0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
324d0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
324e0 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
324f0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
32500 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
32510 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
32520 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
32530 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
32540 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
32550 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
32560 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
32570 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
32580 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
32590 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
325a0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
325b0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
325c0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
325d0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
325e0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
325f0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
32600 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
32610 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
32620 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
32630 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
32640 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
32650 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
32660 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
32670 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
32680 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
32690 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
326a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
326b0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
326c0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
326d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
326e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
326f0 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
32700 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
32710 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
32720 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
32730 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
32740 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
32750 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
32760 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
32770 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
32780 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
32790 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
327a0 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
327b0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
327c0 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
327d0 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
327e0 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
327f0 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
32800 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
32810 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
32820 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
32830 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
32840 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
32850 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
32860 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
32870 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
32880 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
32890 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
328a0 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
328b0 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  By, 0,.         
328c0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c   WHERE_GROUPBY |
328d0 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57   (orderByGrp ? W
328e0 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
328f0 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29   : 0), 0.      )
32900 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
32910 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
32920 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
32930 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
32940 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
32950 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ==pGroupBy->nExp
32960 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
32970 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
32980 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
32990 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
329a0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
329b0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
329c0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
329d0 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
329e0 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
329f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
32a00 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
32a10 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
32a20 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
32a30 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
32a40 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
32a50 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
32a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32a70 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
32a80 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
32a90 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
32aa0 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
32ab0 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
32ac0 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
32ad0 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
32ae0 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
32af0 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
32b00 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
32b10 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
32b20 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
32b30 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
32b40 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
32b50 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
32b60 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
32b70 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
32b80 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
32b90 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
32ba0 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
32bb0 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
32bc0 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
32bd0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
32be0 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
32bf0 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
32c00 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
32c10 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
32c20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
32c30 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
32c40 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
32c50 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
32c60 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
32c70 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
32c80 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
32c90 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
32ca0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
32cb0 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
32cc0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
32cd0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
32ce0 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
32cf0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
32d00 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
32d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
32d20 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
32d30 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
32d40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32d50 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
32d60 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
32d70 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
32d80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32d90 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
32da0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
32db0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
32dc0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
32dd0 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
32de0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
32df0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
32e00 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
32e10 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
32e20 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
32e30 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
32e40 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
32e50 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
32e60 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
32e70 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
32e80 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
32e90 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
32ea0 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
32eb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32ec0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
32ed0 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a  nToReg(pParse, .
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
32f00 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
32f10 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
32f20 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20  iTable, r1);.   
32f30 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
32f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32f50 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
32f60 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
32f70 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
32f80 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32f90 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
32fa0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
32fb0 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
32fc0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
32fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32fe0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
32ff0 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
33000 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
33010 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
33020 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
33030 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
33040 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
33050 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
33060 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
33070 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
33080 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
33090 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
330a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
330b0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
330c0 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
330d0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
330e0 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
330f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
33100 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
33110 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33120 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
33130 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
33140 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
33150 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
33160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
33170 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
33180 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
33190 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
331a0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
331b0 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
331c0 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f   sort")); VdbeCo
331d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
331e0 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
331f0 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
33200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
33210 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
33220 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a  rse);..      }..
33230 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
33240 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61  index or tempora
33250 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ry table used by
33260 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f   the GROUP BY so
33270 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  rt.      ** will
33280 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76   naturally deliv
33290 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  er rows in the o
332a0 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79  rder required by
332b0 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
332c0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63      ** clause, c
332d0 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65  ancel the epheme
332e0 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63  ral table open c
332f0 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20  oded earlier..  
33300 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
33310 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
33320 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
33330 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
33340 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
33350 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  dless..      ** 
33360 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
33370 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
33380 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
33390 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20  TCTRL_OPTIMIZER 
333a0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  to .      ** dis
333b0 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69  able this optimi
333c0 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69  zation for testi
333d0 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f  ng purposes.  */
333e0 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72  .      if( order
333f0 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a  ByGrp && Optimiz
33400 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
33410 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
33420 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26  rder) .       &&
33430 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c   (groupBySort ||
33440 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
33450 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20  orted(pWInfo)). 
33460 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
33470 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
33480 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
33490 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
334a0 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
334b0 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
334c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
334d0 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
334e0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
334f0 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
33500 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
33510 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
33520 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
33530 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
33540 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
33550 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
33560 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
33570 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
33580 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
33590 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
335a0 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
335b0 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
335c0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
335d0 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
335e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
335f0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
33600 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
33610 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
33620 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
33630 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
33640 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
33650 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
33660 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33670 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
33680 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
33690 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20  rtingIdx,.      
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336b0 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72      sortOut, sor
336c0 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  tPTab);.      }.
336d0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
336e0 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
336f0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
33700 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
33710 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
33720 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
33730 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
33740 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
33750 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
33760 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
33770 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
33780 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
33790 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
337a0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
337b0 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
337c0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
337d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
337e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
337f0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
33800 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
33810 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
33820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33830 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
33840 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
33850 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
33860 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
33870 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
33880 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
33890 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
338a0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
338b0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c  P_Jump, addr1+1,
338c0 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64   0, addr1+1); Vd
338d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
338e0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
338f0 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
33900 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
33910 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
33920 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
33930 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
33940 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
33950 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
33960 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
33970 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
33980 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
33990 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
339a0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
339b0 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
339c0 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
339d0 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
339e0 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
339f0 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
33a00 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
33a10 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
33a20 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
33a30 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
33a40 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
33a50 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
33a60 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
33a70 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
33a80 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
33a90 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
33aa0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
33ab0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
33ac0 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
33ad0 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
33ae0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
33af0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
33b00 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
33b10 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
33b20 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
33b30 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
33b40 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
33b50 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
33b60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33b70 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
33b80 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56  lag, addrEnd); V
33b90 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
33ba0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
33bb0 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
33bc0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
33bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
33be0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
33bf0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
33c00 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
33c10 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
33c20 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
33c30 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
33c40 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
33c50 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
33c60 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
33c70 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
33c80 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
33c90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33ca0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
33cb0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
33cc0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
33cd0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
33ce0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
33cf0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33d00 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
33d10 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
33d20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
33d30 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
33d40 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
33d50 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
33d60 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
33d70 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
33d80 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
33d90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
33da0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
33db0 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
33dc0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
33dd0 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
33de0 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
33df0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
33e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33e10 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
33e20 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
33e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
33e40 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
33e50 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a  ddrSortingIdx);.
33e60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
33e70 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
33e80 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
33e90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33ea0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33eb0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
33ec0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
33ed0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
33ee0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
33ef0 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
33f00 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
33f10 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
33f20 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
33f30 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
33f40 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
33f50 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
33f60 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
33f70 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
33f80 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
33f90 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
33fa0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
33fb0 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
33fc0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
33fd0 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
33fe0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
33ff0 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
34000 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
34010 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
34020 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
34030 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
34040 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
34050 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
34060 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
34070 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
34080 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
34090 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
340a0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
340b0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
340c0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
340d0 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
340e0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
340f0 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
34100 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
34110 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
34120 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
34130 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34140 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
34150 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
34160 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
34170 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
34180 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
34190 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
341a0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
341b0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
341c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
341d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
341e0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
341f0 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
34200 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
34210 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
34220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34230 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
34240 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
34250 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
34260 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
34270 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
34280 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
34290 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
342a0 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
342b0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
342c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
342d0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
342e0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
342f0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
34300 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
34310 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
34320 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
34330 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
34340 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
34350 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
34360 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
34370 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
34380 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53  arse, p, -1, &sS
34390 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
343a0 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73             &sDis
343b0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
343c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343d0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
343e0 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
343f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
34400 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
34410 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
34420 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
34430 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
34440 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
34450 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
34460 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
34470 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
34480 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
34490 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
344a0 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
344b0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
344c0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
344d0 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
344e0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
344f0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
34500 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
34510 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34520 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
34530 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
34540 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
34550 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
34560 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
34570 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
34580 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
34590 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
345a0 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69  st *pDel = 0;.#i
345b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
345c0 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
345d0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
345e0 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
345f0 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
34600 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
34610 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
34620 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
34630 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
34640 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
34650 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
34660 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
34670 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
34680 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
34690 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
346a0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
346b0 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
346c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
346d0 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
346e0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
346f0 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
34700 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
34710 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
34720 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
34730 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
34740 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
34750 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
34760 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
34770 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
34780 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
34790 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
347a0 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
347b0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
347c0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
347d0 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
347e0 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
347f0 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
34800 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
34810 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
34820 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
34830 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
34840 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
34850 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
34860 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
34870 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
34880 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
34890 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
348a0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
348b0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
348c0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
348d0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
348e0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
348f0 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
34900 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
34910 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
34920 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
34930 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
34940 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
34950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34960 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
34970 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
34980 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
34990 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
349a0 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
349b0 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
349c0 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
349d0 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
349e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
349f0 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
34a00 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
34a10 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
34a20 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
34a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
34a40 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
34a50 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
34a60 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
34a70 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
34a80 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
34a90 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
34aa0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
34ab0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
34ac0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
34ad0 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
34ae0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
34af0 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65  hat has the lowe
34b00 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20  st scan cost..  
34b10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34b20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
34b30 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
34b40 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
34b50 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
34b60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34b70 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29   ** (2013-10-03)
34b80 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68   Do not count th
34b90 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70  e entries in a p
34ba0 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20  artial index..  
34bb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34bc0 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
34bd0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
34be0 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
34bf0 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
34c00 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
34c10 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
34c20 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
34c30 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34c40 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
34c50 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20  d(pTab) ) pBest 
34c60 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
34c70 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
34c80 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
34c90 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
34ca0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
34cb0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
34cc0 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f    if( pIdx->bUno
34cd0 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
34ce0 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a       && pIdx->sz
34cf0 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
34d00 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20  abRow.          
34d10 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49   && pIdx->pPartI
34d20 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20  dxWhere==0.     
34d30 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74        && (!pBest
34d40 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   || pIdx->szIdxR
34d50 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52  ow<pBest->szIdxR
34d60 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ow).          ){
34d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
34d80 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
34d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
34da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
34db0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
34dc0 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
34dd0 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
34de0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
34df0 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
34e00 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a  pParse, pBest);.
34e10 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
34e20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
34e30 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65  d-only cursor, e
34e40 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f  xecute the OP_Co
34e50 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63  unt, close the c
34e60 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ursor. */.      
34e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34e80 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
34e90 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
34ea0 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20  ot, iDb, 1);.   
34eb0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
34ec0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
34ed0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
34ee0 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
34ef0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
34f00 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
34f10 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
34f20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34f30 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
34f40 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
34f50 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
34f60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
34f70 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
34f80 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65  iCsr);.        e
34f90 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
34fa0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
34fb0 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pBest);.      }e
34fc0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
34fd0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
34fe0 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  OUNT */.      {.
34ff0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
35000 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
35010 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
35020 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
35030 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
35040 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
35050 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
35060 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
35070 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e  CT max(x) FROM .
35080 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ...        **.  
35090 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
350a0 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
350b0 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
350c0 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
350d0 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
350e0 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
350f0 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
35100 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
35110 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
35120 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  e. .        ** I
35130 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
35140 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
35150 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
35160 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
35170 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76          ** add v
35180 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
35190 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
351a0 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
351b0 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  er the .        
351c0 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69  ** first iterati
351d0 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69  on (since the fi
351e0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
351f0 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20   the loop is .  
35200 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
35210 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
35220 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
35230 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
35240 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a  ximum .        *
35250 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68  * value of x, th
35260 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69  e only row requi
35270 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  red)..        **
35280 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70  .        ** A sp
35290 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
352a0 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
352b0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
352c0 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
352d0 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
352e0 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f  ehavior as follo
352f0 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
35300 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
35310 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
35320 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
35330 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
35340 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
35350 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
35360 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
35370 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
35380 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
35390 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
353a0 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
353b0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
353c0 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
353d0 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
353e0 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
353f0 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
35400 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
35410 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
35420 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
35430 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
35440 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
35450 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
35460 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
35470 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
35480 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
35490 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
354a0 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
354b0 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
354c0 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
354d0 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
354e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
354f0 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
35500 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
35510 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  8 flag = WHERE_O
35520 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
35530 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
35540 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
35550 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
35560 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
35570 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
35580 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
35590 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
355a0 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26   = minMaxQuery(&
355b0 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d  sAggInfo, &pMinM
355c0 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ax);.        }. 
355d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
355e0 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d  lag==0 || (pMinM
355f0 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78  ax!=0 && pMinMax
35600 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a  ->nExpr==1) );..
35610 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
35620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   ){.          pM
35630 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
35640 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
35650 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20  MinMax, 0);.    
35660 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
35670 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  nMax;.          
35680 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
35690 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69 6e  ocFailed || pMin
356a0 4d 61 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Max!=0 );.      
356b0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
356c0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
356d0 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
356e0 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
356f0 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f   = flag!=WHERE_O
35700 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b  RDERBY_MIN ?1:0;
35710 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
35720 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  nMax->a[0].pExpr
35730 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
35740 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35750 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
35760 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
35770 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
35780 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
35790 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
357a0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
357b0 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
357c0 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
357d0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
357e0 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
357f0 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
35800 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
35810 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
35820 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
35830 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
35840 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
35850 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
35860 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
35870 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 2c  ere, pMinMax, 0,
35880 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20  flag,0);.       
35890 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
358a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
358b0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
358c0 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
358d0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65         goto sele
358e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  ct_end;.        
358f0 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65  }.        update
35900 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
35910 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
35920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35930 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d  pMinMax==0 || pM
35940 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20  inMax->nExpr==1 
35950 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
35960 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
35970 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29  ered(pWInfo)>0 )
35980 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
35990 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73  te3VdbeGoto(v, s
359a0 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b  qlite3WhereBreak
359b0 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a  Label(pWInfo));.
359c0 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
359d0 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20  mment((v, "%s() 
359e0 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20  by index",.     
359f0 20 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67             (flag
35a00 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  ==WHERE_ORDERBY_
35a10 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29  MIN?"min":"max")
35a20 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
35a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
35a40 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
35a50 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41         finalizeA
35a60 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
35a70 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
35a80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
35a90 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
35aa0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
35ab0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
35ac0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
35ad0 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  rEnd, SQLITE_JUM
35ae0 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
35af0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
35b00 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
35b10 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
35b20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
35b30 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
35b40 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  End);.      sqli
35b50 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
35b60 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20  e(db, pDel);.   
35b70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
35b80 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
35b90 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
35ba0 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67  .  } /* endif ag
35bb0 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f  gregate query */
35bc0 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63  ..  if( sDistinc
35bd0 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45  t.eTnctType==WHE
35be0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
35bf0 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70  DERED ){.    exp
35c00 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
35c10 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22  arse, "DISTINCT"
35c20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
35c30 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
35c40 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
35c50 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72  n we need to sor
35c60 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20  t the results.  
35c70 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d  ** and send them
35c80 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
35c90 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a   one by one..  *
35ca0 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f  /.  if( sSort.pO
35cb0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78  rderBy ){.    ex
35cc0 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
35cd0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
35ce0 20 20 20 20 20 20 20 20 20 20 20 20 73 53 6f 72              sSor
35cf0 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49  t.nOBSat>0 ? "RI
35d00 47 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45  GHT PART OF ORDE
35d10 52 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22  R BY":"ORDER BY"
35d20 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  );.    generateS
35d30 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
35d40 70 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73  p, &sSort, pELis
35d50 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29  t->nExpr, pDest)
35d60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  ;.  }..  /* Jump
35d70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
35d80 69 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  is query.  */.  
35d90 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
35da0 76 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29  veLabel(v, iEnd)
35db0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  ;..  /* The SELE
35dc0 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
35dd0 64 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  d. If there is a
35de0 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50  n error in the P
35df0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a  arse structure,.
35e00 20 20 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74    ** set the ret
35e10 75 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f  urn code to 1. O
35e20 74 68 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20  therwise 0. */. 
35e30 20 72 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e   rc = (pParse->n
35e40 45 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f  Err>0);..  /* Co
35e50 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
35e60 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
35e70 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
35e80 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
35e90 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
35ea0 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
35eb0 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
35ec0 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65  end:.  explainSe
35ed0 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
35ee0 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
35ef0 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a  toreSelectId);..
35f00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
35f10 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  db, sAggInfo.aCo
35f20 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
35f30 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
35f40 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c  .aFunc);.#if SEL
35f50 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
35f60 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31  .  SELECTTRACE(1
35f70 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20  ,pParse,p,("end 
35f80 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b  processing\n"));
35f90 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65  .  pParse->nSele
35fa0 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64  ctIndent--;.#end
35fb0 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
35fc0 7d 0a                                            }.