/ Hex Artifact Content
Login

Artifact 420d3f5d9e24f0d81c28a0d4e5f7d7abf07beae6c25ce8981e51638e9e9ee2ae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1000: 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1010: 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53  e->db,TK_ASTERIS
1020: 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  K,0));.  }.  pNe
1030: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  w->pEList = pELi
1040: 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  st;.  pNew->op =
1050: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e   TK_SELECT;.  pN
1060: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73  ew->selFlags = s
1070: 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  elFlags;.  pNew-
1080: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
1090: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
10a0: 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
10b0: 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77  E_ENABLED.  pNew
10c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20  ->zSelName[0] = 
10d0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65 77  0;.#endif.  pNew
10e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
10f0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1100: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
1110: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
1120: 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
1130: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1140: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1150: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
1160: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72  >db, sizeof(*pSr
1170: 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  c));.  pNew->pSr
1180: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
1190: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
11a0: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
11b0: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
11c0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
11d0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
11e0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
11f0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
1200: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1210: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
1220: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1230: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
1240: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1250: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  t;.  pNew->pWith
1260: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1270: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
1280: 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  imit!=0 || pPars
1290: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 50 61  e->nErr>0 || pPa
12a0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12b0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
12c0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
12e0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
12f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1300: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29   pNew!=&standin)
1310: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1330: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
1340: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
1350: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
1360: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
1370: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
1380: 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45   pNew;.}..#if SE
1390: 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
13a0: 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  D./*.** Set the 
13b0: 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74  name of a Select
13c0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
13d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
13e0: 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20  Name(Select *p, 
13f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1400: 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a  e){.  if( p && z
1410: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1420: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1430: 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  eof(p->zSelName)
1440: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22  , p->zSelName, "
1450: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
1460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1470: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
1480: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
1490: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
14a0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
14b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
14d0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
14e0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
14f0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
1500: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
1510: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1520: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
1530: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1540: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
1550: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1560: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1570: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1580: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1590: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
15a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
15b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
15c0: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
15d0: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
15e0: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
15f0: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
1600: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
1610: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
1620: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
1630: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
1640: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1660: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1670: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1680: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1690: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
16a0: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
16b0: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
16c0: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
16d0: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
16e0: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
16f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
1700: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
1710: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
1720: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
1730: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
1740: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
1750: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1760: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1770: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1780: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1790: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17a0: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
17b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
17c0: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
17d0: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
17e0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
17f0: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
1800: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1830: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
1840: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1850: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1860: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1870: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1880: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1890: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
18a0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
18b0: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
18c0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
18d0: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
18e0: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
18f0: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
1900: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
1910: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
1920: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
1930: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
1940: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
1950: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1960: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1970: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1980: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
19a0: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
19b0: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
19c0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
19e0: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
19f0: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a10: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
1a20: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
1a30: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
1a50: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1a60: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1a70: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1a80: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1a90: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1ac0: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1ae0: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1af0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
1b00: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
1b10: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
1b20: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
1b30: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
1b40: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1b50: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1b60: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1b70: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1b80: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1b90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1ba0: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1bb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1bc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1bd0: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1be0: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1bf0: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1c10: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1c20: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c40: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1c50: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1c60: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1c70: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1c80: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1c90: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1ca0: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1cb0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1cc0: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ce0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1cf0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1d00: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1d10: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1d20: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1d30: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1d40: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1d50: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1d60: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1d70: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1d80: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1d90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1db0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1dc0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1dd0: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1de0: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1df0: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1e00: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1e10: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1e20: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1e30: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1e40: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1e50: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1e60: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1e90: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1ea0: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1eb0: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1ec0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1ed0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1ee0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1ef0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1f00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f10: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1f20: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1f30: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1f40: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1f50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1f60: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1f80: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1f90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fa0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1fc0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fe0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1ff0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
2000: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
2010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2030: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
2040: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
2050: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
2060: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
2070: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
2080: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
2090: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
20a0: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
20b0: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
20c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
20d0: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
20e0: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
20f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
2100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
2110: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
2120: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
2130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
2140: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2150: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2160: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2170: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2180: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2190: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
21a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
21b0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
21c0: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
21e0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
21f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
2200: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2210: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2230: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2240: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
2250: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2260: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2270: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2280: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2290: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
22a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22c0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22d0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
22e0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
22f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2300: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
2310: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
2320: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
2330: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
2340: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
2350: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2360: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2370: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2380: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2390: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
23a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
23b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
23c0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
23d0: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
23e0: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
23f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2400: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2430: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2440: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
2450: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2460: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2470: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2480: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2490: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
24a0: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
24b0: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
24c0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
24d0: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
24e0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
24f0: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
2500: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
2510: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
2520: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
2530: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
2540: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
2550: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2560: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2570: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2580: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2590: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
25a0: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
25b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
25c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
25d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2600: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2610: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2630: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
2640: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2650: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2680: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2690: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
26a0: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
26d0: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2710: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
2720: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2730: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
2740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2750: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2760: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2770: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2780: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
27b0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
27c0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27e0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
27f0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
2800: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2820: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
2830: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
2840: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
2850: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2890: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
28a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
28b0: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
28c0: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
28d0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28e0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28f0: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
2900: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
2910: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2920: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
2930: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
2940: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
2950: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2960: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a  _EQ, pE1, pE2);.
2970: 20 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f    if( pEq && isO
2980: 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  uterJoin ){.    
2990: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
29a0: 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  pEq, EP_FromJoin
29b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
29c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29d0: 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  pEq, EP_TokenOnl
29e0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
29f0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2a20: 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  Eq->iRightJoinTa
2a30: 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e  ble = (i16)pE2->
2a40: 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  iTable;.  }.  *p
2a50: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2a60: 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57  ExprAnd(db, *ppW
2a70: 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f  here, pEq);.}../
2a80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
2a90: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2aa0: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
2ab0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2ac0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
2ad0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
2ae0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
2af0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
2b00: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
2b10: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2b20: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
2b30: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
2b40: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
2b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
2b60: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
2b70: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
2b80: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
2b90: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
2ba0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2bb0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2bc0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2bd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2be0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2bf0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2c00: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2c10: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
2c20: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
2c30: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
2c40: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
2c50: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
2c60: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
2c70: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
2c80: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
2c90: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2ca0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
2cb0: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
2cc0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
2cd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2ce0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2cf0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2d00: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
2d10: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
2d20: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
2d30: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
2d40: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
2d50: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
2d60: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
2d70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
2d80: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
2d90: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
2da0: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
2db0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
2dc0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
2dd0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
2de0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
2df0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
2e00: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e10: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
2e20: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
2e30: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
2e40: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
2e50: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
2e60: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
2e70: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
2e80: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
2e90: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
2ea0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2eb0: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2ec0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2ed0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2ee0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2ef0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2f00: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2f10: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2f20: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2f30: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
2f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2f50: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
2f60: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
2f70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
2f80: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2f90: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
2fa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2fb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2fc0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
2fd0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2fe0: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2ff0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
3000: 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52  duce);.    p->iR
3010: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
3020: 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20  (i16)iTable;.   
3030: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3040: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3050: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3060: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3070: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3080: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3090: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45          setJoinE
30a0: 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  xpr(p->x.pList->
30b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
30c0: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
30d0: 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78   }.    setJoinEx
30e0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
30f0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
3100: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3110: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3120: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3130: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3140: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3160: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3170: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3180: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3190: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
31a0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
31b0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
31c0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
31d0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
31e0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
31f0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
3200: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3210: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3220: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3230: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3240: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3250: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3260: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3270: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3280: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3290: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
32a0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
32b0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
32c0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
32d0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
32e0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
32f0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
3300: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3310: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3320: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3330: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3340: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3350: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3360: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3370: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3380: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
33a0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
33b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
33d0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
33e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
33f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3420: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3430: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3460: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3470: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3480: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3490: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
34a0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
34b0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34c0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
34d0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
34e0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
34f0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3500: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3510: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3520: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3530: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3540: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3550: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3560: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
3570: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
3580: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3590: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
35a0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
35b0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
35c0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
35d0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
35e0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
35f0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3600: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3610: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3620: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3630: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3640: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3650: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3660: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3670: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3680: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3690: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
36a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36b0: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
36c0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
36d0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
36e0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
36f0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3720: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3730: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3740: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3750: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3760: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3780: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3790: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
37a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
37b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
37c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
37d0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
37e0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37f0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3800: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3810: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3820: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3830: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3840: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3850: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3860: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3870: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3880: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3890: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
38a0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
38b0: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
38c0: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
38d0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
38e0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
38f0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3900: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3930: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3950: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3960: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3970: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3980: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3990: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
39a0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
39b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
39c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
39d0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
39e0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
39f0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3a00: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3a10: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3a20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
3a40: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
3a50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3a60: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
3a70: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
3a80: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
3a90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
3aa0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
3ab0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
3ac0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
3ad0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
3ae0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
3af0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
3b00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
3b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3b20: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
3b30: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
3b40: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
3b50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3b60: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
3b70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b80: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3b90: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
3ba0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3bb0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
3bc0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3bd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
3be0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
3bf0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
3c00: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
3c10: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
3c20: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
3c30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3c40: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
3c50: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
3c60: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
3c70: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
3c80: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
3c90: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
3ca0: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
3cb0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
3cc0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
3cd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
3ce0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3cf0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3d00: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
3d10: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
3d20: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
3d30: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
3d40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
3d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3d70: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
3d80: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
3d90: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3da0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
3db0: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
3dc0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
3dd0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
3de0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
3df0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e00: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e10: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
3e20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e30: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
3e40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3e50: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3e60: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
3e70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3e80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
3ea0: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
3eb0: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
3ec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
3ed0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
3ee0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
3ef0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3f00: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3f10: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3f20: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
3f30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3f40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f50: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
3f60: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
3f70: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
3f80: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
3f90: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
3fa0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fd0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3fe0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3ff0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
4000: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4030: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4050: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
4060: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
4070: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
4080: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
4090: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
40a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
40b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
40c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
40d0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
40e0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
40f0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
4100: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
4110: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
4120: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
4130: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
4140: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
4150: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
4160: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
4170: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
4180: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a  o the end */.);.
4190: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
41a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70  code that will p
41b0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69  ush the record i
41c0: 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44  n registers regD
41d0: 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72  ata.** through r
41e0: 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f  egData+nData-1 o
41f0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
4200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4210: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
4220: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4230: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4240: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4250: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4270: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f  tion about the O
4280: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
4290: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
42a0: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
42b0: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
42c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
42d0: 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20  t regData,      
42e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
42f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4300: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
4310: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
4320: 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20  gData,       /* 
4330: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4340: 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f  olding data befo
4350: 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20  re packing */.  
4360: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
4370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4380: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
4390: 74 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a  the data array *
43a0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
43b0: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
43c0: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
43d0: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
43e0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
43f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4400: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4430: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4440: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
4450: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
4460: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4470: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
4480: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
4490: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
44a0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
44b0: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
44c0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
44d0: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
44e0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
4510: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4520: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
4560: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4570: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
4580: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
45b0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
45c0: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
45d0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
4600: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
4610: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
4640: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
4650: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
4660: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
4690: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
46a0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
46b0: 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Seq==1 );.  asse
46c0: 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20  rt( nData==1 || 
46d0: 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67  regData==regOrig
46e0: 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44  Data || regOrigD
46f0: 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
4700: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
4710: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
4720: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
4730: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
4740: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70  = regData - nExp
4750: 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73  r - bSeq;.  }els
4760: 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  e{.    regBase =
4770: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
4780: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
4790: 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20  Mem += nBase;.  
47a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  }.  assert( pSel
47b0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20  ect->iOffset==0 
47c0: 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  || pSelect->iLim
47d0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69  it!=0 );.  iLimi
47e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  t = pSelect->iOf
47f0: 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e  fset ? pSelect->
4800: 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c  iOffset+1 : pSel
4810: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70  ect->iLimit;.  p
4820: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20  Sort->labelDone 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c  eLabel(v);.  sql
4850: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4860: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
4870: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  rt->pOrderBy, re
4880: 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61  gBase, regOrigDa
4890: 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
48b0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20  LITE_ECEL_DUP | 
48c0: 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51  (regOrigData? SQ
48d0: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20  LITE_ECEL_REF : 
48e0: 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  0));.  if( bSeq 
48f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4900: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4910: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4920: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4930: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
4940: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
4950: 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a  0 && nData>0 ){.
4960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4970: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
4980: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
4990: 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61  +nExpr+bSeq, nDa
49a0: 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ta);.  }.  sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
49c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
49d0: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
49e0: 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67  Base-nOBSat, reg
49f0: 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e  Record);.  if( n
4a00: 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69  OBSat>0 ){.    i
4a10: 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20  nt regPrevKey;  
4a20: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f   /* The first nO
4a30: 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  BSat columns of 
4a40: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
4a50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4a60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64  First;    /* Add
4a70: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49  ress of the OP_I
4a80: 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  fNot opcode */. 
4a90: 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20     int addrJmp; 
4aa0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4ab0: 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f  of the OP_Jump o
4ac0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62  pcode */.    Vdb
4ad0: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f  eOp *pOp;      /
4ae0: 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70  * Opcode that op
4af0: 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a  ens the sorter *
4b00: 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20  /.    int nKey; 
4b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b20: 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79  r of sorting key
4b30: 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64   columns, includ
4b40: 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  ing OP_Sequence 
4b50: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
4b60: 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  pKI;     /* Orig
4b70: 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20  inal KeyInfo on 
4b80: 74 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65  the sorter table
4b90: 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76   */..    regPrev
4ba0: 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Key = pParse->nM
4bb0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4bc0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d  ->nMem += pSort-
4bd0: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65  >nOBSat;.    nKe
4be0: 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72  y = nExpr - pSor
4bf0: 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71  t->nOBSat + bSeq
4c00: 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29  ;.    if( bSeq )
4c10: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4c20: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4c30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
4c40: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
4c50: 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ); .    }else{. 
4c60: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
4c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c80: 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p1(v, OP_Sequenc
4c90: 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45  eTest, pSort->iE
4ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
4cb0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4cc0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4ce0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4cf0: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4d00: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4d10: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4d20: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
4d30: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
4d40: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
4d50: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4d60: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4d70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
4d80: 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b   + nData;.    pK
4d90: 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  I = pOp->p4.pKey
4da0: 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Info;.    memset
4db0: 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72  (pKI->aSortOrder
4dc0: 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69  , 0, pKI->nKeyFi
4dd0: 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f  eld); /* Makes O
4de0: 50 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20  P_Jump testable 
4df0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
4e00: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
4e10: 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34  , (char*)pKI, P4
4e20: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74  _KEYINFO);.    t
4e30: 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41  estcase( pKI->nA
4e40: 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e  llField > pKI->n
4e50: 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20  KeyField+2 );.  
4e60: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e70: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e80: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e90: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4ea0: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69       pKI->nAllFi
4ee0: 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65  eld-pKI->nKeyFie
4ef0: 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a  ld-1);.    addrJ
4f00: 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  mp = sqlite3Vdbe
4f10: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
4f20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4f30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
4f40: 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20  , addrJmp+1, 0, 
4f50: 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65  addrJmp+1); Vdbe
4f60: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
4f70: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
4f80: 75 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ut = sqlite3Vdbe
4f90: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
4fa0: 20 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75    pSort->regRetu
4fb0: 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
4fc0: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
4fd0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
4fe0: 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72  _Gosub, pSort->r
4ff0: 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d  egReturn, pSort-
5000: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
5010: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5020: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
5030: 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45  orter, pSort->iE
5040: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
5050: 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20   iLimit ){.     
5060: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5070: 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p2(v, OP_IfNot, 
5080: 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c  iLimit, pSort->l
5090: 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20  abelDone);.     
50a0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
50b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
50c0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
50d0: 76 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20  v, addrFirst);. 
50e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
50f0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
5100: 65 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b  egBase, regPrevK
5110: 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  ey, pSort->nOBSa
5120: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5130: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
5140: 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69  ddrJmp);.  }.  i
5150: 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c  f( pSort->sortFl
5160: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
5170: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
5180: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
5190: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
51a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
51b0: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
51c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
51d0: 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69  (v, op, pSort->i
51e0: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
51f0: 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
5200: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61             regBa
5210: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
5220: 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20  -nOBSat);.  if( 
5230: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e  iLimit ){.    in
5240: 74 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20  t addr;.    int 
5250: 72 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46  r1 = 0;.    /* F
5260: 69 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75  ill the sorter u
5270: 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
5280: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e   LIMIT+OFFSET en
5290: 74 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69  tries.  (The iLi
52a0: 6d 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73  mit.    ** regis
52b0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
52c0: 65 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66  ed with value of
52d0: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20   LIMIT+OFFSET.) 
52e0: 20 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65   After the sorte
52f0: 72 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75  r.    ** fills u
5300: 70 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65  p, delete the le
5310: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
5320: 20 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61   sorter after ea
5330: 63 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a  ch insert..    *
5340: 2a 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20  * Thus we never 
5350: 68 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74  hold more than t
5360: 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  he LIMIT+OFFSET 
5370: 72 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61  rows in memory a
5380: 74 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64  t once */.    ad
5390: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
53a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
53b0: 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b  otZero, iLimit);
53c0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
53d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
53e0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61  eAddOp1(v, OP_La
53f0: 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  st, pSort->iECur
5400: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53  sor);.    if( pS
5410: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
5420: 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  erLoop ){.      
5430: 72 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  r1 = ++pParse->n
5440: 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
5450: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5460: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74  OP_Column, pSort
5470: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70  ->iECursor, nExp
5480: 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64  r, r1);.      Vd
5490: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
54a0: 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  eq"));.    }.   
54b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
54c0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
54d0: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
54e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  );.    if( pSort
54f0: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
5500: 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  oop ){.      /* 
5510: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
5520: 70 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61  p is driven by a
5530: 6e 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61  n index such tha
5540: 74 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20  t values from.  
5550: 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
5560: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
5570: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20   inner loop are 
5580: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
5590: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69   then.      ** i
55a0: 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20  mmediately jump 
55b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
55c0: 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65  ation of an inne
55d0: 72 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20  r loop if the.  
55e0: 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f      ** entry fro
55f0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74  m the current it
5600: 65 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  eration does not
5610: 20 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f   fit into the to
5620: 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54  p.      ** LIMIT
5630: 2b 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20  +OFFSET entries 
5640: 6f 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a  of the sorter. *
5650: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b  /.      int iBrk
5660: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
5670: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
5680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5690: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
56a0: 45 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  Eq, regBase+nExp
56b0: 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20  r, iBrk, r1);.  
56c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
56d0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
56e0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
56f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
5710: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5720: 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a  v, addr);.  }.}.
5730: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5740: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
5750: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
5760: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
5770: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
5780: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
5790: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
57a0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  s VM */.  int iO
57b0: 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52  ffset,      /* R
57c0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
57d0: 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74  the offset count
57e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  er */.  int iCon
57f0: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
5800: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
5810: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
5820: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f  d */.){.  if( iO
5830: 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73  ffset>0 ){.    s
5840: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
5850: 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f  (v, OP_IfPos, iO
5860: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5870: 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 1); VdbeCovera
5880: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
5890: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
58a0: 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ET"));.  }.}../*
58b0: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
58c0: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
58d0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
58e0: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
58f0: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
5900: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
5910: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
5920: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
5930: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
5940: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
5950: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
5960: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
5970: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
5980: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
5990: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
59a0: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
59b0: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
59c0: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
59d0: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
59e0: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
59f0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
5a00: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
5a10: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
5a20: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
5a30: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
5a40: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
5a50: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
5a60: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
5a70: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
5a80: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
5a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
5aa0: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
5ab0: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
5ac0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
5ad0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
5ae0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
5af0: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
5b00: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
5b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b20: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
5b30: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
5b40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
5b50: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
5b60: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
5b70: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
5b80: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
5b90: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5ba0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
5bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5bc0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
5bd0: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
5be0: 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f  iMem, N); VdbeCo
5bf0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
5c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5c10: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5c20: 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20   iMem, N, r1);. 
5c30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c40: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
5c50: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c  nsert, iTab, r1,
5c60: 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c   iMem, N);.  sql
5c70: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
5c80: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
5c90: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
5ca0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5cb0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5cd0: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
5ce0: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
5cf0: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
5d00: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
5d10: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
5d20: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
5d30: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
5d40: 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73  p->pEList expres
5d50: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
5d60: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
5d70: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
5d80: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
5d90: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
5da0: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
5db0: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
5dc0: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
5dd0: 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73   p->pEList is us
5de0: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
5df0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
5e00: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65   columns and the
5e10: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
5e20: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
5e30: 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
5e40: 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  oid selectInnerL
5e50: 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  oop(.  Parse *pP
5e60: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
5e70: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
5e80: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
5e90: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
5ea0: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74    /* The complet
5eb0: 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
5ec0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  nt being coded *
5ed0: 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20  /.  int srcTab, 
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5ef0: 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  ull data from th
5f00: 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d  is table if non-
5f10: 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f  negative */.  So
5f20: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
5f30: 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20        /* If not 
5f40: 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f  NULL, info on ho
5f50: 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44  w to process ORD
5f60: 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69  ER BY */.  Disti
5f70: 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63  nctCtx *pDistinc
5f80: 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c  t, /* If not NUL
5f90: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
5fa0: 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e  o process DISTIN
5fb0: 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  CT */.  SelectDe
5fc0: 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
5fd0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
5fe0: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73  e of the results
5ff0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
6000: 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  nue,          /*
6010: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f   Jump here to co
6020: 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74  ntinue with next
6030: 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42   row */.  int iB
6040: 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20  reak            
6050: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
6060: 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
6070: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  he inner loop */
6080: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
6090: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
60a0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61   int i;.  int ha
60b0: 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20  sDistinct;      
60c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
60d0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
60e0: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
60f0: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
6100: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
6110: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
6120: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
6130: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
6140: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20  pDest->iSDParm; 
6150: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
6160: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
6170: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
6180: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
6190: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
61a0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
61b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66  s */.  int nPref
61c0: 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20  ixReg = 0;      
61d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
61e0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20  extra registers 
61f0: 62 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74  before regResult
6200: 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c   */..  /* Usuall
6210: 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20  y, regResult is 
6220: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69  the first cell i
6230: 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65  n an array of me
6240: 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  mory cells.  ** 
6250: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
6260: 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f  urrent result ro
6270: 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  w. In this case 
6280: 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74  regOrig is set t
6290: 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  o the.  ** same 
62a0: 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20  value. However, 
62b0: 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  if the results a
62c0: 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  re being sent to
62d0: 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65   the sorter, the
62e0: 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72  .  ** values for
62f0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73   any expressions
6300: 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70   that are also p
6310: 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d  art of the sort-
6320: 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a  key are omitted.
6330: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61    ** from this a
6340: 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61  rray. In this ca
6350: 73 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65  se regOrig is se
6360: 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20  t to zero.  */. 
6370: 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20   int regResult; 
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6390: 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20  Start of memory 
63a0: 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20  holding current 
63b0: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74  results */.  int
63c0: 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20   regOrig;       
63d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
63e0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
63f0: 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20  ing full result 
6400: 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73  (or 0) */..  ass
6410: 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65  ert( v );.  asse
6420: 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
6430: 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63   );.  hasDistinc
6440: 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20  t = pDistinct ? 
6450: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
6460: 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53  Type : WHERE_DIS
6470: 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66  TINCT_NOOP;.  if
6480: 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74  ( pSort && pSort
6490: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
64a0: 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28  pSort = 0;.  if(
64b0: 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61   pSort==0 && !ha
64c0: 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  sDistinct ){.   
64d0: 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e   assert( iContin
64e0: 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64  ue!=0 );.    cod
64f0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
6500: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
6510: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
6520: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
6530: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
6540: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e  nResultCol = p->
6550: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a  pEList->nExpr;..
6560: 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64    if( pDest->iSd
6570: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
6580: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
6590: 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f  nPrefixReg = pSo
65a0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt->pOrderBy->nE
65b0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21  xpr;.      if( !
65c0: 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67  (pSort->sortFlag
65d0: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
65e0: 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69  Sorter) ) nPrefi
65f0: 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50  xReg++;.      pP
6600: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50  arse->nMem += nP
6610: 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a  refixReg;.    }.
6620: 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
6630: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
6640: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
6650: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6660: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
6670: 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73  Dest->iSdst+nRes
6680: 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d  ultCol > pParse-
6690: 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  >nMem ){.    /* 
66a0: 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  This is an error
66b0: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20   condition that 
66c0: 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20  can result, for 
66d0: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
66e0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e  SELECT.    ** on
66f0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
6700: 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52  side of an INSER
6710: 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20  T contains more 
6720: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
6730: 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  han.    ** there
6740: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   are columns in 
6750: 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65  the table on the
6760: 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f   left.  The erro
6770: 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74  r will be caught
6780: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f  .    ** and repo
6790: 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74  rted later.  But
67a0: 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   we need to make
67b0: 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d   sure enough mem
67c0: 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ory is allocated
67d0: 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64  .    ** to avoid
67e0: 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20   other spurious 
67f0: 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65  errors in the me
6800: 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70  antime. */.    p
6810: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6820: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20  ResultCol;.  }. 
6830: 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
6840: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65  nResultCol;.  re
6850: 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c  gOrig = regResul
6860: 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  t = pDest->iSdst
6870: 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d  ;.  if( srcTab>=
6880: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
6890: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
68a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
68b0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
68c0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54   OP_Column, srcT
68d0: 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74  ab, i, regResult
68e0: 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +i);.      VdbeC
68f0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
6900: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d   p->pEList->a[i]
6910: 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  .zName));.    }.
6920: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73    }else if( eDes
6930: 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b  t!=SRT_Exists ){
6940: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
6950: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e  estination is an
6960: 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70   EXISTS(...) exp
6970: 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74  ression, the act
6980: 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ual.    ** value
6990: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
69a0: 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74  e SELECT are not
69b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
69c0: 2f 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61  /.    u8 ecelFla
69d0: 67 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73  gs;.    if( eDes
69e0: 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44  t==SRT_Mem || eD
69f0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6a00: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
6a10: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20  routine ){.     
6a20: 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c   ecelFlags = SQL
6a30: 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20  ITE_ECEL_DUP;.  
6a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65    }else{.      e
6a50: 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  celFlags = 0;.  
6a60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72    }.    if( pSor
6a70: 74 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74  t && hasDistinct
6a80: 3d 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52  ==0 && eDest!=SR
6a90: 54 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44  T_EphemTab && eD
6aa0: 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
6ab0: 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65  {.      /* For e
6ac0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
6ad0: 6e 20 70 2d 3e 70 45 4c 69 73 74 20 74 68 61 74  n p->pEList that
6ae0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e   is a copy of an
6af0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20   expression in. 
6b00: 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45       ** the ORDE
6b10: 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f  R BY clause (pSo
6b20: 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73  rt->pOrderBy), s
6b30: 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  et the associate
6b40: 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64  d .      ** iOrd
6b50: 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f  erByCol value to
6b60: 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74   one more than t
6b70: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
6b80: 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20  ORDER BY .      
6b90: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  ** expression wi
6ba0: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65  thin the sort-ke
6bb0: 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53  y that pushOntoS
6bc0: 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e  orter() will gen
6bd0: 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20  erate..      ** 
6be0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
6bf0: 70 2d 3e 70 45 4c 69 73 74 20 66 69 65 6c 64 20  p->pEList field 
6c00: 74 6f 20 62 65 20 6f 6d 69 74 74 65 64 20 66 72  to be omitted fr
6c10: 6f 6d 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  om the sorted re
6c20: 63 6f 72 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73  cord,.      ** s
6c30: 61 76 69 6e 67 20 73 70 61 63 65 20 61 6e 64 20  aving space and 
6c40: 43 50 55 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a  CPU cycles.  */.
6c50: 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20        ecelFlags 
6c60: 7c 3d 20 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f  |= (SQLITE_ECEL_
6c70: 4f 4d 49 54 52 45 46 7c 53 51 4c 49 54 45 5f 45  OMITREF|SQLITE_E
6c80: 43 45 4c 5f 52 45 46 29 3b 0a 20 20 20 20 20 20  CEL_REF);.      
6c90: 66 6f 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42  for(i=pSort->nOB
6ca0: 53 61 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f  Sat; i<pSort->pO
6cb0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
6cc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
6cd0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   j;.        if( 
6ce0: 28 6a 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  (j = pSort->pOrd
6cf0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69  erBy->a[i].u.x.i
6d00: 4f 72 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b  OrderByCol)>0 ){
6d10: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45  .          p->pE
6d20: 4c 69 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78  List->a[j-1].u.x
6d30: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69  .iOrderByCol = i
6d40: 2b 31 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  +1-pSort->nOBSat
6d50: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6d60: 20 20 7d 0a 20 20 20 20 20 20 72 65 67 4f 72 69    }.      regOri
6d70: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  g = 0;.      ass
6d80: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6d90: 53 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  Set || eDest==SR
6da0: 54 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20  T_Mem .         
6db0: 20 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f    || eDest==SRT_
6dc0: 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65  Coroutine || eDe
6dd0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
6de0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 52 65 73  ;.    }.    nRes
6df0: 75 6c 74 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33  ultCol = sqlite3
6e00: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
6e10: 28 70 50 61 72 73 65 2c 70 2d 3e 70 45 4c 69 73  (pParse,p->pELis
6e20: 74 2c 72 65 67 52 65 73 75 6c 74 2c 30 2c 65 63  t,regResult,0,ec
6e30: 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  elFlags);.  }.. 
6e40: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
6e50: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
6e60: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
6e70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
6e80: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
6e90: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
6ea0: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
6eb0: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
6ec0: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
6ed0: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
6ee0: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
6ef0: 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  t ){.    switch(
6f00: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
6f10: 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  tType ){.      c
6f20: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
6f30: 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
6f40: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
6f50: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
6f60: 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   No longer requi
6f70: 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  red OpenEphemera
6f80: 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20  l instr. */.    
6f90: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20      int iJump;  
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
6fb0: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
6fc0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
6fd0: 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
6fe0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
6ff0: 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ow content */.. 
7000: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
7010: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
7020: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
7030: 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76  .        regPrev
7040: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
7050: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
7060: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
7070: 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  ltCol;..        
7080: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
7090: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
70a0: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
70b0: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
70c0: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
70d0: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
70e0: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
70f0: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
7100: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
7110: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
7120: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
7130: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
7140: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
7150: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
7160: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
7170: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
7180: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
7190: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
71a0: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
71b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
71c0: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
71d0: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
71e0: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
71f0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
7200: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
7210: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
7220: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
7230: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
7240: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
7250: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
7260: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
7270: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
7280: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
7290: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73  ntAddr(v) + nRes
72a0: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ultCol;.        
72b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
72c0: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
72d0: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
72e0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
72f0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
7300: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
7310: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
7320: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
7330: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
7340: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7350: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
7360: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
7370: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
7380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
7390: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
73a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
73b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
73c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
73d0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
73e0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
73f0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
7400: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
7410: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7430: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7440: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
7450: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
7460: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
7470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7480: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
7490: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
74a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74c0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74d0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
74e0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
74f0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
7500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7510: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
7520: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
7530: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
7540: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7550: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7560: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
7570: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
7580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7590: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
75a0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
75b0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
75c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
75d0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
75e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
75f0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
7600: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
7610: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
7620: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
7630: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
7640: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
7650: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
7660: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7680: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
7690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
76a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
76b0: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
76c0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
76d0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
76e0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
76f0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
7700: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
7710: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
7720: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
7730: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
7740: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
7750: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
7760: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
7770: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
7780: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
7790: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
77a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
77b0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
77c0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
77d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
77e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
77f0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7800: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7810: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
7820: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7830: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
7840: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7850: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
7860: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7870: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7880: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7890: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
78a0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
78b0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
78c0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
78d0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
78e0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
78f0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
7900: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
7910: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
7920: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
7930: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
7940: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
7950: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7960: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7980: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7990: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
79a0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
79b0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
79c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
79d0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
79e0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
79f0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
7a00: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7a10: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7a20: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7a30: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7a40: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7a50: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7a60: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7a70: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7a80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7a90: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7aa0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7ab0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7ac0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ad0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7ae0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7af0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7b00: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7b10: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7b20: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7b30: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7b40: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7b50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7b60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7b70: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7b80: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b90: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7ba0: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7bb0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7bc0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7bd0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7be0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7bf0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7c00: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7c10: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7c20: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7c30: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7c40: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7c50: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7c60: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7c70: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7c80: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7c90: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7ca0: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7cb0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7cc0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7cd0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7ce0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7cf0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7d00: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7d10: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7d20: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7d30: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7d40: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7d50: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7d60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7d70: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7d80: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7d90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7da0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7dc0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7dd0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7de0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
7df0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
7e00: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7e10: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
7e20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7e30: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7e40: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7e50: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7e60: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
7e70: 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c  Reg,regResult,1,
7e80: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7e90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ea0: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
7eb0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7ec0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7ed0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ee0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7ef0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
7f00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7f20: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7f30: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f40: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7f50: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7f60: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f70: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f80: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7fa0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
7fb0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
7fc0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7fd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fe0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7ff0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
8000: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
8010: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
8020: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
8030: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
8040: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
8050: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
8060: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
8070: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
8080: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
8090: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
80a0: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
80b0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
80c0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
80d0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
80e0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
80f0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
8100: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
8110: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
8120: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
8130: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
8140: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
8150: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
8160: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
8170: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
8180: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
8190: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
81a0: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
81b0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
81c0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
81d0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
81e0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
81f0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
8200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
8210: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8220: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
8230: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
8240: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
8250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8260: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
8270: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8280: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
8290: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
82a0: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
82b0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
82c0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
82d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
82e0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
82f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8300: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
8310: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
8320: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
8330: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8340: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8350: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8360: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8370: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8390: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
83a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
83c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
83e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
83f0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
8400: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8410: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8420: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
8430: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
8440: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
8450: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
8460: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8470: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
8480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8490: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
84a0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
84b0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
84c0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
84d0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
84e0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
84f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
8500: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8510: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
8520: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
8530: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
8540: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
8550: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
8560: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
8570: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
8580: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
8590: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
85a0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
85b0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
85c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
85d0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
85e0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
85f0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
8600: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
8610: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
8620: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
8630: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
8640: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
8650: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
8660: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
8670: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
8680: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8690: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
86a0: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
86b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
86c0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
86d0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
86e0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
86f0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
8700: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
8710: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
8720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8730: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
8740: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8750: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
8760: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
8770: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
8780: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
8790: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
87a0: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
87b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
87c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
87d0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
87e0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
87f0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
8800: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8810: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
8820: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
8830: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8840: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
8850: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
8860: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
8870: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
88a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
88b0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
88c0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
88d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
88e0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
88f0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
8900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8920: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8930: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
8940: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8960: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
8970: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
8980: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8990: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
89a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
89b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89c0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
89d0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
89e0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
89f0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
8a00: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
8a10: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
8a20: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
8a30: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
8a40: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
8a50: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
8a60: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
8a70: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
8a80: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
8a90: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
8aa0: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
8ab0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
8ac0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
8ad0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
8ae0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
8af0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
8b00: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
8b10: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
8b20: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
8b30: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
8b40: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
8b50: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
8b60: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
8b70: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
8b80: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8b90: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8ba0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8bb0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8bc0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8bd0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8be0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8bf0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8c00: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8c10: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8c20: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
8c30: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8c40: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
8c50: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
8c60: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
8c70: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
8c80: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8c90: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8ca0: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8cb0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8cc0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8cd0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8ce0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8cf0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8d00: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8d10: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8d20: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
8d30: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
8d40: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
8d50: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
8d60: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
8d70: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
8d80: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8d90: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8da0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8dd0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8de0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8df0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8e00: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8e10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8e20: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
8e30: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8e40: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
8e50: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8e60: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8e70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8e90: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8ea0: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8eb0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8ec0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8ed0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8ee0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8ef0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8f00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8f10: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f20: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
8f50: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
8f60: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f80: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8f90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8fa0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8fb0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8fc0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8fd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8fe0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8ff0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
9000: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
9010: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9020: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9030: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9040: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
9050: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
9060: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
9070: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
9080: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9090: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
90a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
90b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
90c0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
90d0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
90e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
90f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
9100: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
9110: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
9120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
9130: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
9140: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
9150: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
9160: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
9170: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
9180: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
9190: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
91a0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
91b0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
91c0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
91d0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
91e0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
91f0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
9200: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
9210: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
9220: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
9230: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
9240: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9250: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
9260: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
9270: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9280: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
9290: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
92a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
92b0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
92c0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
92d0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
92e0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
92f0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
9300: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
9310: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
9320: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
9330: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
9340: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
9350: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
9360: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9370: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
9380: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
9390: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
93a0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
93b0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
93c0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
93d0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
93e0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
93f0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
9400: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
9410: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9420: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
9430: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
9440: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
9450: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
9460: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
9470: 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c  +1) - sizeof(Col
9480: 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66  lSeq*);.  KeyInf
9490: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
94a0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
94b0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
94c0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
94d0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
94e0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
94f0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
9500: 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20     p->nKeyField 
9510: 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d  = (u16)N;.    p-
9520: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31  >nAllField = (u1
9530: 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e  6)(N+X);.    p->
9540: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
9550: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
9560: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
9570: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d      memset(&p[1]
9580: 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20  , 0, nExtra);.  
9590: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
95a0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
95b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
95c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
95d0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
95e0: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
95f0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
9600: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
9610: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
9620: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
9630: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  ;.    p->nRef--;
9640: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
9650: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46  ==0 ) sqlite3DbF
9660: 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b  reeNN(p->db, p);
9670: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
9680: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
9690: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
96a0: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
96b0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
96c0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
96d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
96e0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
96f0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
9700: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
9710: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
9720: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
9730: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
9740: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9750: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
9760: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
9770: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
9780: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
9790: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
97a0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
97b0: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
97c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
97d0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
97e0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
97f0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
9800: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
9810: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
9820: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
9830: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
9840: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
9850: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
9860: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
9870: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
9880: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
9890: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
98a0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
98b0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
98c0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
98d0: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
98e0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
98f0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
9900: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
9910: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
9920: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
9930: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
9940: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
9950: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
9960: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
9970: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
9980: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
9990: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
99a0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
99b0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
99c0: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
99d0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
99e0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
99f0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
9a00: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
9a10: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
9a20: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
9a30: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
9a40: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
9a50: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
9a60: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
9a70: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
9a80: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
9a90: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
9aa0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
9ab0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
9ac0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
9ad0: 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  freed..*/.static
9ae0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
9af0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
9b00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9b10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9b20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9b30: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9b40: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
9b50: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
9b60: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
9b70: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
9b80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
9b90: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
9ba0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
9bb0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
9bc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
9bd0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
9be0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
9bf0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
9c00: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
9c10: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
9c20: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
9c30: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
9c40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
9c50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
9c60: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
9c70: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
9c80: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
9c90: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
9ca0: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
9cb0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
9cc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9cd0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
9ce0: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
9cf0: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
9d00: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
9d10: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
9d20: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9d30: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9d40: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c  oll;.      pColl
9d50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9d60: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49  llSeq(pParse, pI
9d70: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
9d80: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
9d90: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
9da0: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  tColl;.      pIn
9db0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61  fo->aColl[i-iSta
9dc0: 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  rt] = pColl;.   
9dd0: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
9de0: 72 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d  rder[i-iStart] =
9df0: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
9e00: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
9e10: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
9e20: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
9e30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
9e40: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
9e50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
9e60: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
9e70: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
9e80: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
9e90: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
9ea0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
9eb0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
9ec0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
9ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9ee0: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
9ef0: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
9f00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
9f10: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
9f20: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
9f30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
9f40: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
9f50: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
9f60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
9f70: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
9f80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9f90: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
9fa0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
9fb0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
9fc0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
9fd0: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
9fe0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
9ff0: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
a000: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
a010: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
a020: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
a030: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
a040: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
a050: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
a060: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
a070: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
a080: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
a090: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
a0a0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
a0b0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
a0c0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
a0d0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
a0e0: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
a0f0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
a100: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
a110: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
a120: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
a130: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
a140: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
a150: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
a160: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a170: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
a180: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
a190: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
a1a0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
a1b0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
a1c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a1d0: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
a1e0: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
a1f0: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
a200: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
a210: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
a220: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
a230: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
a240: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
a250: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
a260: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
a270: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
a280: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
a290: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
a2a0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
a2b0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
a2c0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
a2d0: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
a2e0: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
a2f0: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
a300: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
a310: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
a320: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
a330: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
a340: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
a350: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
a360: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
a370: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
a380: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
a390: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
a3a0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
a3b0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
a3c0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
a3d0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
a3e0: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
a3f0: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
a400: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
a410: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
a420: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a430: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
a440: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a450: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
a460: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
a470: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
a480: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
a490: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
a4a0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
a4b0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
a4c0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
a4d0: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
a4e0: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
a4f0: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
a500: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
a510: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
a520: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
a530: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
a540: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
a550: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
a560: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
a570: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
a580: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
a590: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
a5a0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
a5b0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
a5c0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
a5d0: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
a5e0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
a5f0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
a600: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
a610: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
a620: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
a630: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
a640: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
a650: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
a660: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
a670: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
a680: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
a690: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
a6a0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
a6b0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
a6c0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
a6d0: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
a6e0: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
a6f0: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
a700: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
a710: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
a720: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
a750: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a770: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
a780: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
a790: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
a7a0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a7c0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
a7d0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
a800: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
a810: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
a820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
a830: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
a840: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
a850: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
a860: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
a870: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
a880: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
a890: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
a8a0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
a8b0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
a8c0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a8d0: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
a8e0: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
a8f0: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
a900: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
a910: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
a920: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
a930: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
a940: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
a950: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
a960: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
a970: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
a980: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
a990: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
a9a0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
a9b0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
a9c0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
a9d0: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
a9e0: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
a9f0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
aa00: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
aa10: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
aa20: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
aa30: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
aa40: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
aa50: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
aa60: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
aa70: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
aa80: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
aa90: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
aaa0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
aab0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
aac0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
aad0: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
aae0: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
aaf0: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
ab00: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
ab10: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
ab20: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
ab30: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
ab40: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
ab50: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
ab60: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
ab70: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
ab80: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
ab90: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
aba0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
abb0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
abc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
abd0: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
abe0: 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74  t,   /* Informat
abf0: 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52  ion on the ORDER
ac00: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
ac10: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
ac20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
ac30: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
ac40: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
ac50: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
ac60: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
ac70: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  s here */.){.  V
ac80: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ac90: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20  >pVdbe;         
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
acb0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
acc0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61  ement */.  int a
acd0: 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74  ddrBreak = pSort
ace0: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  ->labelDone;    
acf0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
ad00: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
ad10: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
ad20: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
ad30: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
ad40: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
ad50: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
ad60: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
ad70: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
ad80: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
ad90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
ada0: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
adb0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
adc0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
add0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
ade0: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
adf0: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
ae00: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
ae10: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
ae20: 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f   nKey;.  int iSo
ae30: 72 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20  rtTab;          
ae40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
ae50: 65 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61  er cursor to rea
ae60: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
ae70: 6e 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20  nSortData;      
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ae90: 72 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74  railing values t
aea0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74  o read from sort
aeb0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  er */.  int i;. 
aec0: 20 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20   int bSeq;      
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74   /* True if sort
aef0: 65 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64  er record includ
af00: 65 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20  es seq. no. */. 
af10: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
af20: 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20  _item *aOutEx = 
af30: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20  p->pEList->a;.. 
af40: 20 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65   assert( addrBre
af50: 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53  ak<0 );.  if( pS
af60: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20  ort->labelBkOut 
af70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
af80: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
af90: 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67  osub, pSort->reg
afa0: 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c  Return, pSort->l
afb0: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20  abelBkOut);.    
afc0: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
afd0: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
afe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
aff0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53  solveLabel(v, pS
b000: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
b010: 3b 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70  ;.  }.  iTab = p
b020: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  Sort->iECursor;.
b030: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b040: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
b050: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
b060: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  || eDest==SRT_Me
b070: 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  m ){.    regRowi
b080: 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f  d = 0;.    regRo
b090: 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  w = pDest->iSdst
b0a0: 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20  ;.    nSortData 
b0b0: 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c  = nColumn;.  }el
b0c0: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
b0d0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
b0e0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
b0f0: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
b100: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
b110: 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Parse, nColumn);
b120: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
b130: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20   nColumn;.  }.  
b140: 6e 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  nKey = pOrderBy-
b150: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
b160: 6e 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53  nOBSat;.  if( pS
b170: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
b180: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
b190: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
b1a0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
b1b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
b1c0: 69 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73  iSortTab = pPars
b1d0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69  e->nTab++;.    i
b1e0: 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42  f( pSort->labelB
b1f0: 6b 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64  kOut ){.      ad
b200: 64 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  drOnce = sqlite3
b210: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
b220: 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
b230: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20  rage(v);.    }. 
b240: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b250: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
b260: 73 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c  seudo, iSortTab,
b270: 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65   regSortOut, nKe
b280: 79 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a  y+1+nSortData);.
b290: 20 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65      if( addrOnce
b2a0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
b2b0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e  mpHere(v, addrOn
b2c0: 63 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  ce);.    addr = 
b2d0: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
b2e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
b2f0: 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  erSort, iTab, ad
b300: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64  drBreak);.    Vd
b310: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
b320: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
b330: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
b340: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
b350: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b360: 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
b370: 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72  ta, iTab, regSor
b380: 74 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b  tOut, iSortTab);
b390: 0a 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20  .    bSeq = 0;. 
b3a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
b3b0: 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64   = 1 + sqlite3Vd
b3c0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
b3d0: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
b3e0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
b3f0: 61 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65  age(v);.    code
b400: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
b410: 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e  fset, addrContin
b420: 75 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  ue);.    iSortTa
b430: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53  b = iTab;.    bS
b440: 65 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f  eq = 1;.  }.  fo
b450: 72 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79  r(i=0, iCol=nKey
b460: 2b 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44 61  +bSeq; i<nSortDa
b470: 74 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ta; i++){.    in
b480: 74 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66 28  t iRead;.    if(
b490: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
b4a0: 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20  OrderByCol ){.  
b4b0: 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74      iRead = aOut
b4c0: 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  Ex[i].u.x.iOrder
b4d0: 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c  ByCol-1;.    }el
b4e0: 73 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20  se{.      iRead 
b4f0: 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  = iCol++;.    }.
b500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b510: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
b520: 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52  mn, iSortTab, iR
b530: 65 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a  ead, regRow+i);.
b540: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
b550: 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78  (v, "%s", aOutEx
b560: 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74  [i].zName ? aOut
b570: 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f  Ex[i].zName : aO
b580: 75 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b  utEx[i].zSpan));
b590: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
b5a0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
b5b0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
b5c0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
b5d0: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
b5e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b5f0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
b600: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
b610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b620: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
b630: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
b640: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
b650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b660: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
b670: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
b680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b6a0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
b6b0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
b6c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
b6d0: 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74  olumn==sqlite3St
b6e0: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
b6f0: 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20  ffSdst) );.     
b700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b710: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
b720: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  ord, regRow, nCo
b730: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a  lumn, regRowid,.
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a          pDest->z
b760: 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  AffSdst, nColumn
b770: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b780: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
b790: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
b7a0: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
b7b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b7c0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
b7d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
b7e0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72  arm, regRowid, r
b7f0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
b800: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b810: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
b820: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _Mem: {.      /*
b830: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
b840: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
b850: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
b860: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
b870: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
b880: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
b890: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
b8a0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
b8b0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
b8c0: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
b8d0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
b8e0: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
b8f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
b900: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
b910: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
b920: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
b930: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
b940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b950: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
b960: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
b970: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
b980: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
b990: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
b9a0: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
b9b0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
b9c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b9d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b9e0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
b9f0: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
ba00: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
ba10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ba20: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69   }.  if( regRowi
ba30: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65  d ){.    if( eDe
ba40: 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20  st==SRT_Set ){. 
ba50: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
ba60: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
ba70: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
ba80: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lumn);.    }else
ba90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
baa0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
bab0: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
bac0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
bad0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
bae0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
baf0: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62  ;.  }.  /* The b
bb00: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
bb10: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
bb20: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
bb30: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
bb40: 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  );.  if( pSort->
bb50: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
bb60: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
bb70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
bb80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
bb90: 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20  rterNext, iTab, 
bba0: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
bbb0: 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(v);.  }else{
bbc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bbd0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
bbe0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
bbf0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
bc00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
bc10: 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71  ->regReturn ) sq
bc20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
bc30: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53  v, OP_Return, pS
bc40: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  ort->regReturn);
bc50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
bc60: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
bc70: 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  drBreak);.}../*.
bc80: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
bc90: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
bca0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
bcb0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
bcc0: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
bcd0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
bce0: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
bcf0: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
bd00: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
bd10: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20  .**.** Also try 
bd20: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
bd30: 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75  size of the retu
bd40: 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72  rned value and r
bd50: 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65  eturn that.** re
bd60: 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64  sult in *pEstWid
bd70: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  th..**.** The de
bd80: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
bd90: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
bda0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
bdb0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
bdc0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
bdd0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
bde0: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
bdf0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
be00: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
be10: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
be20: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
be30: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
be40: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
be50: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
be60: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
be70: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
be80: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
be90: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
bea0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
beb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
bec0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
bed0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
bee0: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
bef0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
bf00: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
bf10: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
bf20: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
bf30: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
bf40: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
bf50: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
bf60: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
bf70: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
bf80: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
bf90: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
bfa0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
bfb0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bfc0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
bfd0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
bfe0: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
bff0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
c000: 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72  utine has either
c010: 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65   3 or 6 paramete
c020: 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  rs depending on 
c030: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
c040: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  * the SQLITE_ENA
c050: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
c060: 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ATA compile-time
c070: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e   option is used.
c080: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c090: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c0a0: 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e  METADATA.# defin
c0b0: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
c0c0: 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e  ,C,D,E,F) column
c0d0: 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44  TypeImpl(A,B,C,D
c0e0: 2c 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69  ,E,F).#else /* i
c0f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
c100: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
c110: 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64  METADATA) */.# d
c120: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
c130: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
c140: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c150: 2c 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ,F).#endif.stati
c160: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
c170: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20  lumnTypeImpl(.  
c180: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
c190: 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  , .  Expr *pExpr
c1a0: 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
c1b0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c1c0: 54 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63  TADATA.  const c
c1d0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a  har **pzOrigDb,.
c1e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
c1f0: 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73  zOrigTab,.  cons
c200: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43  t char **pzOrigC
c210: 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20  ol,.#endif.  u8 
c220: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20  *pEstWidth.){.  
c230: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
c240: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  e = 0;.  int j;.
c250: 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20    u8 estWidth = 
c260: 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
c270: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c280: 45 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63  ETADATA.  char c
c290: 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20  onst *zOrigDb = 
c2a0: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
c2b0: 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20  *zOrigTab = 0;. 
c2c0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
c2d0: 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  igCol = 0;.#endi
c2e0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  f..  assert( pEx
c2f0: 70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  pr!=0 );.  asser
c300: 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  t( pNC->pSrcList
c310: 21 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28  !=0 );.  switch(
c320: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
c330: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
c340: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
c350: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
c360: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c370: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
c380: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
c390: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
c3a0: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
c3b0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
c3c0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
c3d0: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
c3e0: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
c3f0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c400: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
c410: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
c420: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
c430: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c440: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
c450: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
c460: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c470: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
c480: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
c490: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
c4a0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
c4b0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
c4c0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
c4d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
c4e0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
c4f0: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
c500: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
c510: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
c520: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
c530: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
c540: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
c550: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
c560: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
c570: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
c580: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
c590: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
c5a0: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
c5b0: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
c5c0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
c5d0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
c5e0: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
c5f0: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
c600: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
c610: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
c620: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
c630: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
c640: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
c650: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
c660: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
c670: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
c680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c690: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
c6a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
c6b0: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
c6c0: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
c6d0: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
c6e0: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
c6f0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
c700: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
c710: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
c720: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
c730: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
c740: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
c750: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
c760: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
c770: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
c780: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
c790: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
c7a0: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
c7b0: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
c7c0: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
c7d0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
c7e0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
c7f0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
c800: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
c810: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
c820: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
c830: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
c840: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
c850: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
c860: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
c870: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
c880: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
c890: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
c8a0: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
c8b0: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
c8c0: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
c8d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
c8e0: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
c8f0: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
c900: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
c910: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
c920: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
c930: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
c940: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
c950: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
c960: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
c970: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
c980: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
c990: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
c9a0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
c9b0: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
c9c0: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
c9d0: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
c9e0: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
c9f0: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
ca00: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
ca10: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
ca20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ca30: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
ca40: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
ca50: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
ca60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
ca70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
ca80: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
ca90: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
caa0: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
cab0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
cac0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
cad0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cae0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
caf0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
cb00: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
cb10: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
cb20: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
cb30: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
cb40: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
cb50: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
cb60: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53  ol>=0 && iCol<pS
cb70: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cb80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
cb90: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
cba0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
cbb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
cbc0: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
cbd0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
cbe0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
cbf0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
cc00: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
cc10: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
cc20: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
cc30: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
cc40: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
cc50: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
cc60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
cc70: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
cc80: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
cc90: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
cca0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
ccb0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
ccc0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
ccd0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
cce0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
ccf0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
cd00: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
cd10: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
cd20: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
cd30: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
cd40: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
cd50: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
cd60: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
cd70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61     }else if( pTa
cd80: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
cd90: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20        /* A real 
cda0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
cdb0: 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a   assert( !pS );.
cdc0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
cdd0: 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
cde0: 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
cdf0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
ce00: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
ce10: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
ce20: 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ) );.#ifdef SQLI
ce30: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
ce40: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
ce50: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
ce60: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
ce70: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
ce80: 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20         zOrigCol 
ce90: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
cea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ceb0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70      zOrigCol = p
cec0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
ced0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
cee0: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
cef0: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
cf00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
cf10: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
cf20: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
cf30: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
cf40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cf50: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
cf60: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
cf70: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
cf80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
cf90: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
cfa0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d  hemaToIndex(pNC-
cfb0: 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  >pParse->db, pTa
cfc0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
cfd0: 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d         zOrigDb =
cfe0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pNC->pParse->db
cff0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
d000: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
d010: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
d020: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
d030: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
d040: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
d050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d060: 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   zType = sqlite3
d070: 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62  ColumnType(&pTab
d080: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b  ->aCol[iCol],0);
d090: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
d0a0: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
d0b0: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
d0c0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
d0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
d0e0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
d0f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
d100: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
d110: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
d120: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
d130: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
d140: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
d150: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
d160: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
d170: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
d180: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
d190: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
d1a0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
d1b0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
d1c0: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
d1d0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
d1e0: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
d1f0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
d200: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
d210: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
d220: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
d230: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d240: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d250: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
d260: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
d270: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
d280: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
d290: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
d2a0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
d2b0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
d2c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d2d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d2e0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
d2f0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
d300: 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20  &estWidth); .   
d310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d320: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
d330: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d340: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d350: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
d360: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
d370: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
d380: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
d390: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
d3a0: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
d3b0: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
d3c0: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
d3d0: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
d3e0: 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57  ndif.  if( pEstW
d3f0: 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74  idth ) *pEstWidt
d400: 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20  h = estWidth;.  
d410: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
d420: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
d430: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
d440: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
d450: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
d460: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
d470: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
d480: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
d490: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
d4a0: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
d4b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
d4c0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
d4d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
d4e0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
d4f0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
d500: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
d510: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
d520: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
d530: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
d540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d550: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
d560: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
d570: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
d580: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
d590: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
d5a0: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
d5b0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
d5c0: 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65  Parse;.  sNC.pNe
d5d0: 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  xt = 0;.  for(i=
d5e0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
d5f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
d600: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
d610: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
d620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
d630: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
d640: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
d650: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
d660: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
d670: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
d680: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
d690: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
d6a0: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
d6b0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
d6c0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
d6d0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
d6e0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
d6f0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0);..    /* The
d700: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
d710: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
d720: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
d730: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
d740: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
d750: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
d760: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
d770: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
d780: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
d790: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
d7a0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
d7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d7c0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d7d0: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
d7e0: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
d7f0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
d800: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
d810: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
d820: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
d830: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
d840: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
d850: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
d860: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
d870: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
d880: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
d890: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
d8a0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
d8b0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
d8c0: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
d8d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
d8e0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
d8f0: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
d900: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
d910: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
d920: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
d930: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43  (SQLITE_OMIT_DEC
d940: 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  LTYPE) */.}.../*
d950: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
d960: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
d970: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
d980: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ent..**.** The o
d990: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68  nly guarantee th
d9a0: 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20  at SQLite makes 
d9b0: 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  about column nam
d9c0: 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68  es is that if th
d9d0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20  e.** column has 
d9e0: 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73  an AS clause ass
d9f0: 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65  igning it a name
da00: 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74  , that will be t
da10: 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a  he name used..**
da20: 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c   That is the onl
da30: 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61  y documented gua
da40: 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72  rantee.  However
da50: 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c  , countless appl
da60: 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65  ications.** deve
da70: 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79  loped over the y
da80: 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62  ears have made b
da90: 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69  aseless assumpti
daa0: 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  ons about column
dab0: 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69   names.** and wi
dac0: 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73  ll break if thos
dad0: 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68  e assumptions ch
dae0: 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75  anges.  Hence, u
daf0: 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69  se extreme cauti
db00: 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66  on.** when modif
db10: 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ying this routin
db20: 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b  e to avoid break
db30: 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a  ing legacy..**.*
db40: 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69  * See Also: sqli
db50: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
db60: 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54  prList().**.** T
db70: 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f  he PRAGMA short_
db80: 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64  column_names and
db90: 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c   PRAGMA full_col
dba0: 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e  umn_names settin
dbb0: 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63  gs are.** deprec
dbc0: 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75  ated.  The defau
dbd0: 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68  lt setting is sh
dbe0: 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46  ort=ON, full=OFF
dbf0: 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a  .  99.9% of all.
dc00: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20  ** applications 
dc10: 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74  should operate t
dc20: 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74  his way.  Nevert
dc30: 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20  heless, we need 
dc40: 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a  to support the.*
dc50: 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f  * other modes fo
dc60: 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20  r legacy:.**.** 
dc70: 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75     short=OFF, fu
dc80: 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c  ll=OFF:      Col
dc90: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20  umn name is the 
dca0: 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72  text of the expr
dcb0: 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a  ession has it.**
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72                or
dce0: 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73  iginally appears
dcf0: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
dd00: 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a  tatement.  In.**
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 20 20 20 20 20 6f 74                ot
dd30: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a  her words, the z
dd40: 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75  Span of the resu
dd50: 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  lt expression..*
dd60: 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e  *.**    short=ON
dd70: 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20  , full=OFF:     
dd80: 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64    (This is the d
dd90: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e  efault setting).
dda0: 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a    If the result.
ddb0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20  refers directly 
dde0: 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  to a table colum
ddf0: 6e 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  n, then the resu
de00: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69     column name i
de30: 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65  s just the table
de40: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 43 4f   column name: CO
de50: 4c 55 4d 4e 2e 20 0a 2a 2a 20 20 20 20 20 20 20  LUMN. .**       
de60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de70: 20 20 20 20 20 20 20 4f 74 68 65 72 77 69 73 65         Otherwise
de80: 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a   use zSpan..**.*
de90: 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68  *    full=ON, sh
dea0: 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49  ort=ANY:       I
deb0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66  f the result ref
dec0: 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
ded0: 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a  a table column,.
dee0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
df10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68  column name with
df20: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a   the table name.
df30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c  prefix, ex: TABL
df60: 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72  E.COLUMN.  Other
df70: 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a  wise use zSpan..
df80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
df90: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
dfa0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
dfb0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
dfc0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
dfd0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
dfe0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
dff0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
e000: 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74  r this SELECT st
e010: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
e020: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
e030: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
e040: 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
e050: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
e060: 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
e070: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69   *pEList;.  sqli
e080: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e090: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c  ->db;.  int full
e0a0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c  Name;    /* TABL
e0b0: 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41  E.COLUMN if no A
e0c0: 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20  S clause and is 
e0d0: 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72  a direct table r
e0e0: 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e  ef */.  int srcN
e0f0: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55  ame;     /* COLU
e100: 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55  MN or TABLE.COLU
e110: 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75  MN if no AS clau
e120: 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74  se and is direct
e130: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
e140: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
e150: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
e160: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
e170: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
e180: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
e190: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
e1a0: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
e1b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
e1c0: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d  lNamesSet || db-
e1d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
e1e0: 72 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c  return;.  /* Col
e1f0: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64 65  umn names are de
e200: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
e210: 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
e220: 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  f a compound sel
e230: 65 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ect */.  while( 
e240: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
e250: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
e260: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 70  ect->pPrior;.  p
e270: 54 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  TabList = pSelec
e280: 74 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  t->pSrc;.  pELis
e290: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
e2a0: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76  ist;.  assert( v
e2b0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e2c0: 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a   pTabList!=0 );.
e2d0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
e2e0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
e2f0: 6c 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61  lName = (db->fla
e300: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
e310: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
e320: 73 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66  srcName = (db->f
e330: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
e340: 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20  ortColNames)!=0 
e350: 7c 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73  || fullName;.  s
e360: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
e370: 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e  Cols(v, pEList->
e380: 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d  nExpr);.  for(i=
e390: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
e3a0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
e3b0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
e3c0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20  a[i].pExpr;..   
e3d0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
e3e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
e3f0: 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op!=TK_AGG_COLUM
e400: 4e 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f  N );  /* Agg pro
e410: 63 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20  cessing has not 
e420: 72 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61  run yet */.    a
e430: 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b  ssert( p->op!=TK
e440: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54  _COLUMN || p->pT
e450: 61 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65  ab!=0 ); /* Cove
e460: 72 69 6e 67 20 69 6e 64 65 78 65 73 20 6e 6f 74  ring indexes not
e470: 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20 20   yet coded */.  
e480: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
e490: 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  i].zName ){.    
e4a0: 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75 73    /* An AS claus
e4b0: 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20 66  e always takes f
e4c0: 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a 2f  irst priority */
e4d0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  .      char *zNa
e4e0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
e4f0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73  ].zName;.      s
e500: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
e510: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
e520: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
e530: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
e540: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
e550: 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e 6f   srcName && p->o
e560: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
e570: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
e580: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
e590: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
e5a0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e 70       pTab = p->p
e5b0: 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Tab;.      asser
e5c0: 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
e5d0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e5e0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
e5f0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
e600: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
e610: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
e620: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
e630: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
e640: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
e650: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
e660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e670: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
e680: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
e690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e6a0: 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   fullName ){.   
e6b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
e6c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
e6d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
e6e0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
e6f0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
e700: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
e710: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e720: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
e730: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
e740: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
e750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e770: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e780: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
e790: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
e7a0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
e7b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e7c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
e7d0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
e7e0: 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
e7f0: 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
e800: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
e810: 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
e820: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e830: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
e840: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e850: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
e860: 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
e870: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
e880: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
e890: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
e8a0: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
e8b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
e8c0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
e8d0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
e8e0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
e8f0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
e900: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
e910: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
e920: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
e930: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
e940: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
e950: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
e960: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
e970: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
e980: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
e990: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
e9a0: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
e9b0: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
e9c0: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
e9d0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
e9e0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
e9f0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
ea00: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
ea10: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
ea20: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
ea30: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
ea40: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
ea50: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
ea60: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
ea70: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
ea80: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
ea90: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
eaa0: 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68  _NOMEM..**.** Th
eab0: 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65  e only guarantee
eac0: 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b   that SQLite mak
ead0: 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  es about column 
eae0: 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69 66  names is that if
eaf0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68   the.** column h
eb00: 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  as an AS clause 
eb10: 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e  assigning it a n
eb20: 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62  ame, that will b
eb30: 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e  e the name used.
eb40: 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65 20  .** That is the 
eb50: 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20  only documented 
eb60: 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65  guarantee.  Howe
eb70: 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61  ver, countless a
eb80: 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64  pplications.** d
eb90: 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68  eveloped over th
eba0: 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61 64  e years have mad
ebb0: 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d  e baseless assum
ebc0: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c  ptions about col
ebd0: 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64  umn names.** and
ebe0: 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74   will break if t
ebf0: 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73  hose assumptions
ec00: 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65   changes.  Hence
ec10: 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63 61  , use extreme ca
ec20: 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f  ution.** when mo
ec30: 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75  difying this rou
ec40: 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72  tine to avoid br
ec50: 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a  eaking legacy..*
ec60: 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 67  *.** See Also: g
ec70: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ec80: 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es().*/.int sqli
ec90: 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
eca0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
ecb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
ecc0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ecd0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
ece0: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20  st *pEList,     
ecf0: 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66    /* Expr list f
ed00: 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72  rom which to der
ed10: 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ive column names
ed20: 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c   */.  i16 *pnCol
ed30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
ed40: 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
ed50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72  r of columns her
ed60: 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a  e */.  Column **
ed70: 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f  paCol          /
ed80: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
ed90: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65  column list here
eda0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
edb0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
edc0: 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65  b;   /* Database
edd0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
ede0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee00: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
ee10: 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20 20  .  u32 cnt;     
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee30: 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f  * Index added to
ee40: 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75   make the name u
ee50: 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d  nique */.  Colum
ee60: 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20  n *aCol, *pCol; 
ee70: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
ee80: 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c  oping over resul
ee90: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
eea0: 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
eeb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
eec0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
eed0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
eee0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  t */.  char *zNa
eef0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
ef00: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
ef10: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
ef20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ef30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
ef40: 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
ef50: 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ef70: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
ef80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
ef90: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
efa0: 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
efb0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
efc0: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
efd0: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
efe0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
eff0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
f000: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
f010: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
f020: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
f030: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
f040: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
f050: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28   assert( nCol==(
f060: 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70  i16)nCol );.  *p
f070: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
f080: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
f090: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
f0a0: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21  Col; i<nCol && !
f0b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f0c0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
f0d0: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
f0e0: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
f0f0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
f100: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 7a 4e    */.    if( (zN
f110: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
f120: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
f130: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f140: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
f150: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
f160: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
f170: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
f180: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f190: 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72    Expr *pColExpr
f1a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
f1b0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
f1c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
f1d0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f 6c       while( pCol
f1e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  Expr->op==TK_DOT
f1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
f200: 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Expr = pColExpr-
f210: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
f220: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
f230: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  r!=0 );.      }.
f240: 20 20 20 20 20 20 69 66 28 20 28 70 43 6f 6c 45        if( (pColE
f250: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
f260: 4d 4e 20 7c 7c 20 70 43 6f 6c 45 78 70 72 2d 3e  MN || pColExpr->
f270: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
f280: 4e 29 0a 20 20 20 20 20 20 20 26 26 20 70 43 6f  N).       && pCo
f290: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 0a  lExpr->pTab!=0 .
f2a0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
f2b0: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
f2c0: 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
f2d0: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
f2e0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
f2f0: 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ColExpr->iColumn
f300: 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  ;.        Table 
f310: 2a 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72  *pTab = pColExpr
f320: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
f330: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
f340: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
f350: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
f360: 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d   iCol>=0 ? pTab-
f370: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
f380: 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  e : "rowid";.   
f390: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
f3a0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  lExpr->op==TK_ID
f3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
f3c0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
f3d0: 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45  erty(pColExpr, E
f3e0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
f3f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
f400: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
f410: 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
f420: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
f430: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
f440: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
f450: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
f460: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
f470: 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d   zName = pEList-
f480: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
f490: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f4a0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
f4b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
f4c0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e  3DbStrDup(db, zN
f4d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
f4e0: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
f4f0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
f500: 2c 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29  ,"column%d",i+1)
f510: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f520: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
f530: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
f540: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
f550: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
f560: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
f570: 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65  n integer to the
f580: 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74   name so that it
f590: 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e   becomes unique.
f5a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20  .    */.    cnt 
f5b0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
f5c0: 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  zName && sqlite3
f5d0: 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e  HashFind(&ht, zN
f5e0: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
f5f0: 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
f600: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
f610: 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65  .      if( nName
f620: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  >0 ){.        fo
f630: 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30  r(j=nName-1; j>0
f640: 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67   && sqlite3Isdig
f650: 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d  it(zName[j]); j-
f660: 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -){}.        if(
f670: 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29   zName[j]==':' )
f680: 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20   nName = j;.    
f690: 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20    }.      zName 
f6a0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
f6b0: 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20  (db, "%.*z:%u", 
f6c0: 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b  nName, zName, ++
f6d0: 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  cnt);.      if( 
f6e0: 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 46  cnt>3 ) sqlite3F
f6f0: 61 73 74 52 61 6e 64 6f 6d 6e 65 73 73 28 26 64  astRandomness(&d
f700: 62 2d 3e 73 50 72 6e 67 2c 20 73 69 7a 65 6f 66  b->sPrng, sizeof
f710: 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
f720: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
f730: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
f740: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
f750: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
f760: 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
f770: 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
f780: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
f790: 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
f7a0: 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
f7b0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
f7c0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
f7d0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
f7e0: 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
f7f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f800: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
f810: 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
f820: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f830: 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
f840: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f850: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
f860: 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
f870: 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
f880: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
f890: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
f8a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
f8b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f8c0: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
f8d0: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
f8e0: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
f8f0: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
f900: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
f910: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
f920: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
f930: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
f940: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
f950: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
f960: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
f970: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
f980: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
f990: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
f9a0: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
f9b0: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
f9c0: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
f9d0: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
f9e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f9f0: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
fa00: 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
fa10: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
fa20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
fa30: 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
fa40: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
fa50: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
fa60: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
fa70: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
fa80: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
fa90: 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
faa0: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
fab0: 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
fac0: 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
fad0: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
fae0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
faf0: 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
fb00: 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
fb10: 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
fb20: 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
fb30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fb40: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
fb50: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
fb60: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
fb70: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
fb80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
fb90: 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
fba0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
fbb0: 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b    u64 szAll = 0;
fbc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  ..  assert( pSel
fbd0: 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ect!=0 );.  asse
fbe0: 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65  rt( (pSelect->se
fbf0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
fc00: 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73  lved)!=0 );.  as
fc10: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
fc20: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
fc30: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
fc40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
fc50: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
fc60: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
fc70: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
fc80: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
fc90: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
fca0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
fcb0: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
fcc0: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
fcd0: 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (i=0, pCol=pTab-
fce0: 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e  >aCol; i<pTab->n
fcf0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
fd00: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
fd10: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e  r *zType;.    in
fd20: 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20  t n, m;.    p = 
fd30: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
fd40: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
fd50: 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30  pe(&sNC, p, 0, 0
fd60: 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73  , 0, &pCol->szEs
fd70: 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d  t);.    szAll +=
fd80: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20   pCol->szEst;.  
fd90: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
fda0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
fdb0: 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69  finity(p);.    i
fdc0: 66 28 20 7a 54 79 70 65 20 26 26 20 28 6d 20 3d  f( zType && (m =
fdd0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
fde0: 28 7a 54 79 70 65 29 29 3e 30 20 29 7b 0a 20 20  (zType))>0 ){.  
fdf0: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
fe00: 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e  trlen30(pCol->zN
fe10: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
fe20: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
fe30: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
fe40: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  (db, pCol->zName
fe50: 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20  , n+m+2);.      
fe60: 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  if( pCol->zName 
fe70: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
fe80: 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e  y(&pCol->zName[n
fe90: 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29  +1], zType, m+1)
fea0: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e  ;.        pCol->
feb0: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
fec0: 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20  LAG_HASTYPE;.   
fed0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
fee0: 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  f( pCol->affinit
fef0: 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66  y==0 ) pCol->aff
ff00: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
ff10: 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f  FF_BLOB;.    pCo
ff20: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
ff30: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ff40: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
ff50: 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  l && pCol->zColl
ff60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  ==0 ){.      pCo
ff70: 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  l->zColl = sqlit
ff80: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
ff90: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
ffa0: 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e    }.  }.  pTab->
ffb0: 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74  szTabRow = sqlit
ffc0: 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34  e3LogEst(szAll*4
ffd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
ffe0: 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  n a SELECT state
fff0: 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61  ment, generate a
10000 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
10010 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a   that describes.
10020 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
10030 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54  t of that SELECT
10040 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
10050 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
10060 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72  lect(Parse *pPar
10070 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
10080 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ect){.  Table *p
10090 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Tab;.  sqlite3 *
100a0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
100b0 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67  .  int savedFlag
100c0 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73  s;..  savedFlags
100d0 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
100e0 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
100f0 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65  LITE_FullColName
10100 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
10110 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
10120 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65  lNames;.  sqlite
10130 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
10140 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b  se, pSelect, 0);
10150 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
10160 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
10170 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
10180 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65  ->pPrior ) pSele
10190 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
101a0 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  rior;.  db->flag
101b0 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  s = savedFlags;.
101c0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
101d0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
101e0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29   sizeof(Table) )
101f0 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
10200 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
10210 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71  .  }.  /* The sq
10220 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
10230 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79  Select() is only
10240 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73   used n contexts
10250 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65   where lookaside
10260 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  .  ** is disable
10270 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64  d */.  assert( d
10280 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
10290 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d  sable );.  pTab-
102a0 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
102b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b  pTab->zName = 0;
102c0 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67  .  pTab->nRowLog
102d0 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
102e0 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
102f0 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
10300 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  ;.  sqlite3Colum
10310 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
10320 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
10330 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
10340 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
10350 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
10360 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
10370 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72  ndCollation(pPar
10380 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65 63  se, pTab, pSelec
10390 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65  t);.  pTab->iPKe
103a0 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  y = -1;.  if( db
103b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
103c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  {.    sqlite3Del
103d0 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54 61  eteTable(db, pTa
103e0 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  b);.    return 0
103f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
10400 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Tab;.}../*.** Ge
10410 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68 65  t a VDBE for the
10420 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63 6f   given parser co
10430 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20 61  ntext.  Create a
10440 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
10450 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20  ssary..** If an 
10460 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
10470 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65  turn NULL and le
10480 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69 6e  ave a message in
10490 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65   pParse..*/.Vdbe
104a0 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62 65   *sqlite3GetVdbe
104b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
104c0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
104d0 56 64 62 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Vdbe ){.    retu
104e0 72 6e 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  rn pParse->pVdbe
104f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
10500 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
10510 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
10520 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
10530 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63  e->db,SQLITE_Fac
10540 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29  torOutConst).  )
10550 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b  {.    pParse->ok
10560 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b  ConstFactor = 1;
10570 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
10580 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
10590 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pParse);.}.../*.
105a0 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
105b0 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
105c0 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
105d0 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
105e0 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
105f0 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
10600 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
10610 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
10620 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
10630 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
10640 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
10650 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
10660 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
10670 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
10680 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
10690 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
106a0 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
106b0 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
106c0 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
106d0 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
106e0 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
106f0 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
10700 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
10710 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
10720 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
10730 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
10740 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
10750 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
10760 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
10770 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
10780 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
10790 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
107a0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
107b0 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
107c0 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
107d0 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
107e0 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
107f0 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
10800 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
10810 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
10820 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
10830 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29  lt values (zero)
10840 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
10850 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
10860 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66  e..**.** The iOf
10870 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69  fset register (i
10880 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
10890 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
108a0 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
108b0 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20  he OFFSET.  The 
108c0 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20  iLimit register 
108d0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
108e0 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74  o LIMIT.  Regist
108f0 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20  er.** iOffset+1 
10900 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
10910 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a  o LIMIT+OFFSET..
10920 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  **.** Only if pL
10930 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
10940 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
10950 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
10960 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
10970 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
10980 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
10990 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
109a0 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
109b0 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
109c0 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
109d0 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
109e0 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
109f0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
10a00 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
10a10 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10a20 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
10a30 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10a40 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
10a50 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
10a60 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
10a70 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e  iOffset;.  int n
10a80 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
10a90 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  t ) return;..  /
10aa0 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d  * .  ** "LIMIT -
10ab0 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20  1" always shows 
10ac0 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65  all rows.  There
10ad0 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f   is some.  ** co
10ae0 6e 74 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20  ntroversy about 
10af0 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  what the correct
10b00 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64   behavior should
10b10 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75   be..  ** The cu
10b20 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
10b30 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20  tion interprets 
10b40 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61  "LIMIT 0" to mea
10b50 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a  n.  ** no rows..
10b60 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
10b70 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
10b80 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
10b90 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  p->pOffset==0 ||
10ba0 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b   p->pLimit!=0 );
10bb0 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74  .  if( p->pLimit
10bc0 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69   ){.    p->iLimi
10bd0 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70  t = iLimit = ++p
10be0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
10bf0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
10c00 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
10c10 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
10c20 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10c30 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
10c40 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a  >pLimit, &n) ){.
10c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10c60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
10c70 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74  teger, n, iLimit
10c80 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
10c90 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20  ment((v, "LIMIT 
10ca0 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
10cb0 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
10cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10cd0 65 47 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b 29  eGoto(v, iBreak)
10ce0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10cf0 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65  ( n>=0 && p->nSe
10d00 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c  lectRow>sqlite3L
10d10 6f 67 45 73 74 28 28 75 36 34 29 6e 29 20 29 7b  ogEst((u64)n) ){
10d20 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
10d30 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
10d40 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29 3b 0a  LogEst((u64)n);.
10d50 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
10d60 61 67 73 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c  ags |= SF_FixedL
10d70 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  imit;.      }.  
10d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
10d90 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
10da0 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74  Parse, p->pLimit
10db0 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
10dc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10dd0 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49  p1(v, OP_MustBeI
10de0 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62  nt, iLimit); Vdb
10df0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10e00 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
10e10 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
10e20 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
10e30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10e40 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d  , OP_IfNot, iLim
10e50 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  it, iBreak); Vdb
10e60 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
10e70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
10e80 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
10e90 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
10ea0 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
10eb0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
10ec0 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
10ed0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
10ee0 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
10ef0 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
10f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10f10 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
10f20 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
10f30 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
10f40 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
10f50 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
10f60 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
10f70 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
10f80 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10f90 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
10fa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10fb0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10fc0 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c  _OffsetLimit, iL
10fd0 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c  imit, iOffset+1,
10fe0 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
10ff0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11000 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29   "LIMIT+OFFSET")
11010 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
11020 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11030 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
11040 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ECT./*.** Return
11050 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
11060 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
11070 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c  nce for the iCol
11080 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a  -th column of.**
11090 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
110a0 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
110b0 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e  -select statemen
110c0 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e  t "p".  Return N
110d0 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f  ULL if.** the co
110e0 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61  lumn has no defa
110f0 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ult collating se
11100 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  quence..**.** Th
11110 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
11120 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d  ence for the com
11130 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20  pound select is 
11140 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a  taken from the.*
11150 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d  * left-most term
11160 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74   of the select t
11170 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  hat has a collat
11180 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f  ing sequence..*/
11190 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20  .static CollSeq 
111a0 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c  *multiSelectColl
111b0 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
111c0 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
111d0 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53  t iCol){.  CollS
111e0 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20  eq *pRet;.  if( 
111f0 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  p->pPrior ){.   
11200 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c   pRet = multiSel
11210 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
11220 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43  e, p->pPrior, iC
11230 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
11240 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a    pRet = 0;.  }.
11250 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
11260 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d  0 );.  /* iCol m
11270 75 73 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ust be less than
11280 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
11290 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e  r.  Otherwise an
112a0 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a   error would.  *
112b0 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f  * have been thro
112c0 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72  wn during name r
112d0 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65  esolution and we
112e0 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20   would not have 
112f0 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  gotten.  ** this
11300 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52   far */.  if( pR
11310 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28  et==0 && ALWAYS(
11320 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
11330 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52  nExpr) ){.    pR
11340 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
11350 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11360 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
11370 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
11380 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
11390 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63  ./*.** The selec
113a0 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73  t statement pass
113b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
113c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
113d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
113e0 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52  ** with an ORDER
113f0 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73   BY clause. This
11400 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
11410 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
11420 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72  a KeyInfo.** str
11430 75 63 74 75 72 65 20 73 75 69 74 61 62 6c 65 20  ucture suitable 
11440 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67  for implementing
11450 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
11460 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
11470 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ld the KeyInfo s
11480 74 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61  tructure is obta
11490 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
114a0 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  . The calling.**
114b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73   function is res
114c0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73  ponsible for ens
114d0 75 72 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  uring that this 
114e0 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
114f0 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
11500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
11510 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  nfo *multiSelect
11520 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50  OrderByKeyInfo(P
11530 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
11540 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78  lect *p, int nEx
11550 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  tra){.  ExprList
11560 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
11570 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20  pOrderBy;.  int 
11580 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  nOrderBy = p->pO
11590 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
115a0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
115b0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79  Parse->db;.  Key
115c0 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c  Info *pRet = sql
115d0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
115e0 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45  (db, nOrderBy+nE
115f0 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20  xtra, 1);.  if( 
11600 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  pRet ){.    int 
11610 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
11620 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
11630 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
11640 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
11650 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d  tem = &pOrderBy-
11660 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70  >a[i];.      Exp
11670 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d  r *pTerm = pItem
11680 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43  ->pExpr;.      C
11690 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a  ollSeq *pColl;..
116a0 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
116b0 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c  >flags & EP_Coll
116c0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
116d0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
116e0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
116f0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
11700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
11710 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
11720 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
11730 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  , p, pItem->u.x.
11740 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a  iOrderByCol-1);.
11750 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
11760 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64  l==0 ) pColl = d
11770 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
11780 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
11790 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20  a[i].pExpr =.   
117a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
117b0 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69  prAddCollateStri
117c0 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  ng(pParse, pTerm
117d0 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
117e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
117f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
11800 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
11810 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20  (pRet) );.      
11820 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pRet->aColl[i] =
11830 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52   pColl;.      pR
11840 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  et->aSortOrder[i
11850 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
11860 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
11870 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
11880 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64  n pRet;.}..#ifnd
11890 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
118a0 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  TE./*.** This ro
118b0 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
118c0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d  VDBE code to com
118d0 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pute the content
118e0 20 6f 66 20 61 20 57 49 54 48 20 52 45 43 55 52   of a WITH RECUR
118f0 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66  SIVE.** query of
11900 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
11910 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61     <recursive-ta
11920 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d  ble> AS (<setup-
11930 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c  query> UNION [AL
11940 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75  L] <recursive-qu
11950 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20  ery>).**        
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20   \___________/  
11980 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
11990 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20  ___________/.** 
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
119c0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
119d0 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a           p.**.**
119e0 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65 78 61  .** There is exa
119f0 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e  ctly one referen
11a00 63 65 20 74 6f 20 74 68 65 20 72 65 63 75 72 73  ce to the recurs
11a10 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65  ive-table in the
11a20 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20   FROM clause.** 
11a30 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  of recursive-que
11a40 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20  ry, marked with 
11a50 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d  the SrcList->a[]
11a60 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  .fg.isRecursive 
11a70 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  flag..**.** The 
11a80 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73  setup-query runs
11a90 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74   once to generat
11aa0 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74  e an initial set
11ab0 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f   of rows that go
11ac0 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65  .** into a Queue
11ad0 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72   table.  Rows ar
11ae0 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
11af0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11b00 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20   one by.** one. 
11b10 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61 63   Each row extrac
11b20 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69  ted from Queue i
11b30 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73  s output to pDes
11b40 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e  t.  Then the sin
11b50 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  gle.** extracted
11b60 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65   row (now in the
11b70 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29   iCurrent table)
11b80 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e   becomes the con
11b90 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72  tent of the.** r
11ba0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66  ecursive-table f
11bb0 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d 71  or a recursive-q
11bc0 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f  uery run.  The o
11bd0 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65 63  utput of the rec
11be0 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20  ursive-query.** 
11bf0 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e  is added back in
11c00 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
11c10 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65  le.  Then anothe
11c20 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63 74  r row is extract
11c30 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a  ed from Queue.**
11c40 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74 69   and the iterati
11c50 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74  on continues unt
11c60 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  il the Queue tab
11c70 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a  le is empty..**.
11c80 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75  ** If the compou
11c90 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f  nd query operato
11ca0 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20  r is UNION then 
11cb0 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77  no duplicate row
11cc0 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e  s are ever.** in
11cd0 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
11ce0 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
11cf0 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c  e iDistinct tabl
11d00 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f  e keeps a copy o
11d10 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68  f all rows.** th
11d20 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65 65  at have ever bee
11d30 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
11d40 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65 73  Queue and causes
11d50 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62   duplicates to b
11d60 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20  e.** discarded. 
11d70 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   If the operator
11d80 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74   is UNION ALL, t
11d90 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61  hen duplicates a
11da0 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a  re allowed..** .
11db0 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  ** If the query 
11dc0 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c  has an ORDER BY,
11dd0 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e   then entries in
11de0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11df0 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20   are kept in.** 
11e00 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20 61  ORDER BY order a
11e10 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  nd the first ent
11e20 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ry is extracted 
11e30 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20  for each cycle. 
11e40 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f   Without.** an O
11e50 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75 65  RDER BY, the Que
11e60 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74  ue table is just
11e70 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49   a FIFO..**.** I
11e80 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  f a LIMIT clause
11e90 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68   is provided, th
11ea0 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  en the iteration
11eb0 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d   stops after LIM
11ec0 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20  IT rows.** have 
11ed0 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70  been output to p
11ee0 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f  Dest.  A LIMIT o
11ef0 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20  f zero means to 
11f00 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61  output no rows a
11f10 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65  nd a.** negative
11f20 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20   LIMIT means to 
11f30 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e  output all rows.
11f40 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c    If there is al
11f50 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61  so an OFFSET cla
11f60 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f  use.** with a po
11f70 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68  sitive value, th
11f80 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  en the first OFF
11f90 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65 20  SET outputs are 
11fa0 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65 72  discarded rather
11fb0 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73  .** than being s
11fc0 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  ent to pDest.  T
11fd0 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64  he LIMIT count d
11fe0 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e  oes not begin un
11ff0 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54  til after OFFSET
12000 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65  .** rows have be
12010 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  en skipped..*/.s
12020 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
12030 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
12040 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a  Query(.  Parse *
12050 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
12060 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
12070 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
12080 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12090 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45  The recursive SE
120a0 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64  LECT to be coded
120b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
120c0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
120d0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
120e0 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
120f0 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
12100 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20  rc = p->pSrc;   
12110 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
12120 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65 63  lause of the rec
12130 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
12140 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e    int nCol = p->
12150 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20  pEList->nExpr;  
12160 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
12170 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75  umns in the recu
12180 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20  rsive table */. 
12190 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
121a0 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f  e->pVdbe;      /
121b0 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
121c0 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63  tatement under c
121d0 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
121e0 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20   Select *pSetup 
121f0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f  = p->pPrior;   /
12200 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65 72  * The setup quer
12210 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54  y */.  int addrT
12220 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
12230 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74       /* Top of t
12240 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
12250 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
12260 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f  reak;      /* CO
12270 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b  NTINUE and BREAK
12280 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20   addresses */.  
12290 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30  int iCurrent = 0
122a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
122b0 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   The Current tab
122c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43  le */.  int regC
122d0 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
122e0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
122f0 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e  r holding Curren
12300 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
12310 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20 20   iQueue;        
12320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12330 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
12340 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74  .  int iDistinct
12350 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12360 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e   /* To ensure un
12370 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66 20  ique results if 
12380 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65  UNION */.  int e
12390 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b  Dest = SRT_Fifo;
123a0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
123b0 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65 75  to write to Queu
123c0 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  e */.  SelectDes
123d0 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20 20  t destQueue;    
123e0 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65       /* SelectDe
123f0 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74 68  st targetting th
12400 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f  e Queue table */
12410 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
12440 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12470 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  de */.  ExprList
12480 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20   *pOrderBy;     
12490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
124a0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
124b0 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
124c0 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  *pOffset;       
124d0 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61  /* Saved LIMIT a
124e0 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69  nd OFFSET */.  i
124f0 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67  nt regLimit, reg
12500 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
12510 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20 62  Registers used b
12520 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  y LIMIT and OFFS
12530 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  ET */..  /* Obta
12540 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  in authorization
12550 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69   to do a recursi
12560 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  ve query */.  if
12570 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
12580 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
12590 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20  E_RECURSIVE, 0, 
125a0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
125b0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68  .  /* Process th
125c0 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
125d0 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74  ET clauses, if t
125e0 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61  hey exist */.  a
125f0 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
12600 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
12610 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
12620 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
12630 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
12640 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
12650 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
12660 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a   p, addrBreak);.
12670 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
12680 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20  imit;.  pOffset 
12690 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
126a0 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  regLimit = p->iL
126b0 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65  imit;.  regOffse
126c0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
126d0 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d    p->pLimit = p-
126e0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
126f0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  p->iLimit = p->i
12700 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f  Offset = 0;.  pO
12710 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
12720 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61  erBy;..  /* Loca
12730 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
12740 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72  mber of the Curr
12750 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ent table */.  f
12760 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
12770 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b  <pSrc->nSrc); i+
12780 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63  +){.    if( pSrc
12790 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75  ->a[i].fg.isRecu
127a0 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
127b0 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e  Current = pSrc->
127c0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
127d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
127e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
127f0 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62  ate cursors numb
12800 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e  ers for Queue an
12810 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65  d Distinct.  The
12820 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
12830 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74  or.  ** the Dist
12840 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20  inct table must 
12850 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67  be exactly one g
12860 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75  reater than Queu
12870 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20  e in order.  ** 
12880 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74  for the SRT_Dist
12890 46 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73  Fifo and SRT_Dis
128a0 74 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69  tQueue destinati
128b0 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a  ons to work. */.
128c0 20 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73    iQueue = pPars
128d0 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28  e->nTab++;.  if(
128e0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
128f0 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20   ){.    eDest = 
12900 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44  pOrderBy ? SRT_D
12910 69 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44  istQueue : SRT_D
12920 69 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69  istFifo;.    iDi
12930 73 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  stinct = pParse-
12940 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65  >nTab++;.  }else
12950 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
12960 72 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65  rderBy ? SRT_Que
12970 75 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20  ue : SRT_Fifo;. 
12980 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
12990 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
129a0 51 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51  Queue, eDest, iQ
129b0 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ueue);..  /* All
129c0 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f  ocate cursors fo
129d0 72 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65  r Current, Queue
129e0 2c 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  , and Distinct. 
129f0 2a 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20  */.  regCurrent 
12a00 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12a10 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12a20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
12a30 50 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74  Pseudo, iCurrent
12a40 2c 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43  , regCurrent, nC
12a50 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  ol);.  if( pOrde
12a60 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
12a70 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d  fo *pKeyInfo = m
12a80 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
12a90 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
12aa0 20 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69   p, 1);.    sqli
12ab0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12ac0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
12ad0 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65  l, iQueue, pOrde
12ae0 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
12af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12b00 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
12b10 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
12b20 46 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65  FO);.    destQue
12b30 75 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  ue.pOrderBy = pO
12b40 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b  rderBy;.  }else{
12b50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12b60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
12b70 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
12b80 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20  ue, nCol);.  }. 
12b90 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12ba0 20 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29   "Queue table"))
12bb0 3b 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63  ;.  if( iDistinc
12bc0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72  t ){.    p->addr
12bd0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71  OpenEphm[0] = sq
12be0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12bf0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
12c00 72 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20  ral, iDistinct, 
12c10 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  0);.    p->selFl
12c20 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
12c30 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20  hemeral;.  }..  
12c40 2f 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52  /* Detach the OR
12c50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
12c60 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  om the compound 
12c70 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70  SELECT */.  p->p
12c80 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
12c90 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
12ca0 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75  ults of the setu
12cb0 70 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65  p-query in Queue
12cc0 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70  . */.  pSetup->p
12cd0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Next = 0;.  rc =
12ce0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
12cf0 50 61 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26  Parse, pSetup, &
12d00 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53  destQueue);.  pS
12d10 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  etup->pNext = p;
12d20 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
12d30 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76   end_of_recursiv
12d40 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46  e_query;..  /* F
12d50 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77  ind the next row
12d60 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e   in the Queue an
12d70 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f  d output that ro
12d80 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d  w */.  addrTop =
12d90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12da0 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
12db0 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72 65   iQueue, addrBre
12dc0 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
12dd0 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  e(v);..  /* Tran
12de0 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
12df0 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
12e00 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
12e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e20 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
12e30 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
12e40 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
12e50 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
12e60 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
12e70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12e80 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
12e90 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
12ea0 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
12eb0 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
12ec0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12ed0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
12ee0 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
12ef0 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
12f00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12f10 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
12f20 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
12f30 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
12f40 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
12f50 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
12f60 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12f70 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66  bel(v);.  codeOf
12f80 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65  fset(v, regOffse
12f90 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  t, addrCont);.  
12fa0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
12fb0 70 50 61 72 73 65 2c 20 70 2c 20 69 43 75 72 72  pParse, p, iCurr
12fc0 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c  ent,.      0, 0,
12fd0 20 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74   pDest, addrCont
12fe0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
12ff0 69 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a  if( regLimit ){.
13000 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13010 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
13020 4a 75 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d  JumpZero, regLim
13030 69 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  it, addrBreak);.
13040 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
13050 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
13060 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
13070 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  el(v, addrCont);
13080 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74  ..  /* Execute t
13090 68 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c  he recursive SEL
130a0 45 43 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73  ECT taking the s
130b0 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72  ingle row in Cur
130c0 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65  rent as.  ** the
130d0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72   value for the r
130e0 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20  ecursive-table. 
130f0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
13100 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a  s in the Queue..
13110 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
13120 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
13130 65 67 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c  egate ){.    sql
13140 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13150 72 73 65 2c 20 22 72 65 63 75 72 73 69 76 65 20  rse, "recursive 
13160 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
13170 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  s not supported"
13180 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13190 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
131a0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
131b0 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
131c0 74 51 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73  tQueue);.    ass
131d0 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
131e0 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69  0 );.    p->pPri
131f0 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d  or = pSetup;.  }
13200 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
13210 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
13220 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
13230 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
13240 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
13250 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
13260 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
13270 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
13280 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  ..end_of_recursi
13290 76 65 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69  ve_query:.  sqli
132a0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
132b0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  e(pParse->db, p-
132c0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d  >pOrderBy);.  p-
132d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
132e0 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  erBy;.  p->pLimi
132f0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d  t = pLimit;.  p-
13300 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
13310 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  et;.  return;.}.
13320 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13330 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a  _OMIT_CTE */../*
13340 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
13350 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces */.static in
13360 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
13370 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
13380 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
13390 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
133a0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
133b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
133c0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
133d0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
133e0 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
133f0 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13400 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13410 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13420 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61   */.);../*.** Ha
13430 6e 64 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c  ndle the special
13440 20 63 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f   case of a compo
13450 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20  und-select that 
13460 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20  originates from 
13470 61 0a 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75  a.** VALUES clau
13480 73 65 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67  se.  By handling
13490 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
134a0 61 6c 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69  al case, we avoi
134b0 64 20 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73  d deep.** recurs
134c0 69 6f 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f  ion, and thus do
134d0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66   not need to enf
134e0 6f 72 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f  orce the SQLITE_
134f0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
13500 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41  ELECT.** on a VA
13510 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  LUES clause..**.
13520 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 53  ** Because the S
13530 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69  elect object ori
13540 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56  ginates from a V
13550 41 4c 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a  ALUES clause:.**
13560 20 20 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f     (1) It has no
13570 20 4c 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54   LIMIT or OFFSET
13580 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65  .**   (2) All te
13590 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c  rms are UNION AL
135a0 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65  L.**   (3) There
135b0 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20   is no ORDER BY 
135c0 63 6c 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63  clause.*/.static
135d0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
135e0 56 61 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20  Values(.  Parse 
135f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13600 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
13610 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
13620 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
13630 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
13640 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
13650 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
13660 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
13670 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
13680 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
13690 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63  ts */.){.  Selec
136a0 74 20 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74  t *pPrior;.  int
136b0 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74   nRow = 1;.  int
136c0 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72   rc = 0;.  asser
136d0 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  t( p->selFlags &
136e0 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29   SF_MultiValue )
136f0 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65  ;.  do{.    asse
13700 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  rt( p->selFlags 
13710 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20  & SF_Values );. 
13720 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
13730 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e  ==TK_ALL || (p->
13740 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26  op==TK_SELECT &&
13750 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29   p->pPrior==0) )
13760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
13770 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20  >pLimit==0 );.  
13780 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
13790 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61  fset==0 );.    a
137a0 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
137b0 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  =0 || p->pEList-
137c0 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74  >nExpr==p->pNext
137d0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
137e0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  );.    if( p->pP
137f0 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  rior==0 ) break;
13800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
13810 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70  pPrior->pNext==p
13820 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   );.    p = p->p
13830 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b  Prior;.    nRow+
13840 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a  +;.  }while(1);.
13850 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
13860 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
13870 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72  rior;.    p->pPr
13880 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  ior = 0;.    rc 
13890 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
138a0 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
138b0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
138c0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69   = pPrior;.    i
138d0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
138e0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
138f0 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d   = nRow;.    p =
13900 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
13910 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13920 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13930 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
13940 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
13950 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
13960 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
13970 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
13980 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
13990 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
139a0 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
139b0 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
139c0 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
139d0 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
139e0 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
139f0 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
13a00 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
13a10 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
13a20 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
13a30 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
13a40 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
13a50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
13a60 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
13a70 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
13a80 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
13a90 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
13aa0 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
13ab0 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
13ac0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
13ad0 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
13ae0 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
13af0 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
13b00 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
13b10 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
13b20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
13b30 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
13b40 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
13b50 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
13b60 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
13b70 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
13b80 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
13b90 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
13ba0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
13bb0 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
13bc0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
13bd0 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
13be0 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
13bf0 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
13c10 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
13c20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
13c30 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
13c40 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
13c50 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
13c60 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
13c70 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
13c80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13c90 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
13ca0 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
13cb0 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
13cc0 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
13cd0 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
13ce0 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
13cf0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
13d00 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
13d10 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
13d20 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
13d30 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
13d40 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
13d50 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
13d60 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
13d70 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
13d80 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
13d90 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
13da0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13db0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
13dc0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
13dd0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
13de0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
13df0 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
13e00 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
13e10 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
13e20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
13e30 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
13e40 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
13e50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
13e60 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
13e70 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
13e80 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
13e90 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
13ea0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
13eb0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
13ec0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
13ed0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
13ee0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
13ef0 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
13f00 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
13f10 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
13f20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
13f30 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
13f40 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
13f50 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
13f60 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
13f70 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
13f80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
13f90 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
13fa0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
13fb0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13fc0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
13fd0 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20  int iSub1 = 0;  
13fe0 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
13ff0 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
14000 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
14010 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  2 = 0;        /*
14020 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
14030 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
14040 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
14050 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
14060 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
14070 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
14080 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
14090 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
140a0 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
140b0 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
140c0 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
140d0 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
140e0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
140f0 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
14100 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
14110 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
14120 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
14130 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
14140 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
14150 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e  rsive)==0 || p->
14160 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d  op==TK_ALL || p-
14170 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
14180 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
14190 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
141a0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74  ->pPrior;.  dest
141b0 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
141c0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
141d0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
141e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
141f0 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
14200 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
14210 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
14220 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
14230 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
14240 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
14250 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
14260 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
14270 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
14280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14290 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
142a0 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
142b0 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
142c0 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
142d0 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
142e0 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
142f0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
14300 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
14310 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
14320 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
14330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
14340 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
14350 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
14360 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
14370 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
14380 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
14390 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
143a0 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
143b0 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
143c0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
143d0 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
143e0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
143f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14400 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
14410 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
14420 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70  st.iSDParm, p->p
14430 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
14440 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
14450 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
14460 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e    /* Special han
14470 64 6c 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70  dling for a comp
14480 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74  ound-select that
14490 20 6f 72 69 67 69 6e 61 74 65 73 20 61 73 20 61   originates as a
144a0 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a   VALUES clause..
144b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65    */.  if( p->se
144c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74  lFlags & SF_Mult
144d0 69 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63  iValue ){.    rc
144e0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61   = multiSelectVa
144f0 6c 75 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  lues(pParse, p, 
14500 26 64 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f  &dest);.    goto
14510 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
14520 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  d;.  }..  /* Mak
14530 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
14540 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
14550 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
14560 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
14570 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
14580 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
14590 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
145a0 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
145b0 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
145c0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
145d0 74 2d 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72  t->nExpr==pPrior
145e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
145f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
14600 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66  TE_OMIT_CTE.  if
14610 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
14620 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a  SF_Recursive ){.
14630 20 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68      generateWith
14640 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70  RecursiveQuery(p
14650 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
14660 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
14670 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20  ..  /* Compound 
14680 53 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76  SELECTs that hav
14690 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
146a0 61 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64  ause are handled
146b0 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a   separately..  *
146c0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  /.  if( p->pOrde
146d0 72 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rBy ){.    retur
146e0 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  n multiSelectOrd
146f0 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  erBy(pParse, p, 
14700 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
14710 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
14720 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74  ode for the left
14730 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43   and right SELEC
14740 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
14750 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  */.  switch( p->
14760 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
14770 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69  K_ALL: {.      i
14780 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
14790 20 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20     int nLimit;. 
147a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
147b0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
147c0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c        pPrior->iL
147d0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
147e0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
147f0 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66  iOffset = p->iOf
14800 66 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69  fset;.      pPri
14810 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->pLimit = p->
14820 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  pLimit;.      pP
14830 72 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20  rior->pOffset = 
14840 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
14850 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14860 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
14870 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14880 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14890 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
148a0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73  se, pPrior, &des
148b0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
148c0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
148d0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
148e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
148f0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
14900 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
14910 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
14920 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
14930 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72   p->iLimit = pPr
14940 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20  ior->iLimit;.   
14950 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
14960 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b  pPrior->iOffset;
14970 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c  .      if( p->iL
14980 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
14990 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
149a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
149b0 66 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  fNot, p->iLimit)
149c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
149d0 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
149e0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70  omment((v, "Jump
149f0 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20   ahead if LIMIT 
14a00 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20  reached"));.    
14a10 20 20 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73      if( p->iOffs
14a20 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  et ){.          
14a30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14a40 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
14a50 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a70 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69   p->iLimit, p->i
14a80 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66  Offset+1, p->iOf
14a90 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
14aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
14ab0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
14ac0 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
14ad0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
14ae0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14af0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
14b00 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
14b10 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
14b20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
14b30 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
14b40 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
14b50 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
14b60 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
14b70 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  ctRow = sqlite3L
14b80 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c  ogEstAdd(p->nSel
14b90 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e  ectRow, pPrior->
14ba0 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
14bb0 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70     if( pPrior->p
14bc0 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20  Limit.       && 
14bd0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
14be0 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69  eger(pPrior->pLi
14bf0 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20  mit, &nLimit).  
14c00 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30       && nLimit>0
14c10 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
14c20 77 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w > sqlite3LogEs
14c30 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a  t((u64)nLimit) .
14c40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
14c50 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
14c60 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
14c70 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20  u64)nLimit);.   
14c80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
14c90 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ddr ){.        s
14ca0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
14cb0 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20  re(v, addr);.   
14cc0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
14cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14ce0 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20   TK_EXCEPT:.    
14cf0 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b  case TK_UNION: {
14d00 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e  .      int union
14d10 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
14d20 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
14d30 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14d40 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
14d50 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20  /.      u8 op = 
14d60 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
14d70 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72  of the SRT_ oper
14d80 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20  ations to apply 
14d90 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20  to self */.     
14da0 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20   int priorOp;   
14db0 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70    /* The SRT_ op
14dc0 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79  eration to apply
14dd0 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74   to prior select
14de0 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20  s */.      Expr 
14df0 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
14e00 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75  t; /* Saved valu
14e10 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20  es of p->nLimit 
14e20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a  and p->nOffset *
14e30 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
14e40 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65  ;.      SelectDe
14e50 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20  st uniondest;.. 
14e60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
14e70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
14e80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
14e90 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  e( p->op==TK_UNI
14ea0 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f  ON );.      prio
14eb0 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b  rOp = SRT_Union;
14ec0 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
14ed0 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29  eDest==priorOp )
14ee0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
14ef0 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
14f00 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
14f10 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
14f20 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
14f30 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
14f40 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
14f50 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
14f60 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
14f70 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
14f80 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
14f90 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
14fa0 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
14fb0 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
14fc0 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
14fd0 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
14fe0 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
14ff0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
15000 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15010 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
15020 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
15030 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
15040 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
15050 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
15060 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
15070 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
15080 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
15090 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
150a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
150b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
150c0 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
150d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
150e0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
150f0 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
15100 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
15110 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
15120 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
15130 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
15140 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
15150 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69  addr;.        fi
15160 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
15170 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
15180 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  sesEphemeral;.  
15190 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
151a0 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20  >pEList );.     
151b0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64   }..      /* Cod
151c0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
151d0 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c  tements to our l
151e0 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  eft.      */.   
151f0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
15200 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a  or->pOrderBy );.
15210 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
15220 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69  ectDestInit(&uni
15230 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c  ondest, priorOp,
15240 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20   unionTab);.    
15250 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
15260 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
15270 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
15280 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15290 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
152a0 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69  se, pPrior, &uni
152b0 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69  ondest);.      i
152c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
152d0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
152e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
152f0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
15300 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
15310 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  T statement.    
15320 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
15330 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ->op==TK_EXCEPT 
15340 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  ){.        op = 
15350 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20  SRT_Except;.    
15360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15370 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
15380 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
15390 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
153a0 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  on;.      }.    
153b0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
153c0 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20  .      pLimit = 
153d0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
153e0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
153f0 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20        pOffset = 
15400 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
15410 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
15420 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73  ;.      uniondes
15430 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20  t.eDest = op;.  
15440 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
15450 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
15460 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
15470 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
15480 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15490 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64  arse, p, &uniond
154a0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
154b0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
154c0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  _OK );.      /* 
154d0 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
154e0 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
154f0 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
15500 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
15510 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
15520 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
15530 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
15540 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
15550 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
15560 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
15570 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
15580 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
15590 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72  pDelete = p->pPr
155a0 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  ior;.      p->pP
155b0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
155c0 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
155d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
155e0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
155f0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
15600 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
15610 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
15620 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
15630 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
15640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
15650 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
15660 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
15670 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
15680 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
15690 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
156a0 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
156b0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
156c0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
156d0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
156e0 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
156f0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
15700 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
15710 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
15720 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
15730 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
15740 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
15750 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
15760 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
15770 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
15780 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
15790 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
157a0 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
157b0 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
157c0 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
157d0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
157e0 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 42  st );.        iB
157f0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
15800 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
15810 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
15820 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15830 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
15840 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
15850 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
15860 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
15870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15880 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
15890 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72  d, unionTab, iBr
158a0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
158b0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  ge(v);.        i
158c0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
158d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
158e0 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  );.        selec
158f0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
15900 65 2c 20 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a  e, p, unionTab,.
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
15930 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
15940 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
15950 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
15960 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
15970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15980 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15990 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
159a0 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
159b0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
159c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
159d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
159e0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
159f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15a00 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
15a10 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
15a20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
15a30 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
15a40 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
15a50 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
15a60 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
15a70 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
15a80 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
15a90 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
15aa0 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
15ab0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
15ac0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
15ad0 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
15ae0 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
15af0 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
15b00 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
15b10 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
15b20 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
15b30 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
15b40 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
15b50 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
15b60 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
15b70 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
15b80 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
15b90 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
15ba0 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
15bb0 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
15bc0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
15bd0 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
15be0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
15bf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15c00 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
15c10 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
15c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15c30 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
15c40 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
15c50 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
15c60 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
15c70 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
15c80 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
15c90 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 66   = addr;.      f
15ca0 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
15cb0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
15cc0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
15cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15ce0 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
15cf0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
15d00 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
15d10 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
15d20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
15d30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
15d40 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
15d50 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
15d60 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
15d70 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  b1);.      expla
15d80 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
15d90 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
15da0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
15db0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
15dc0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
15dd0 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
15de0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
15df0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
15e00 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
15e10 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
15e20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
15e30 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
15e40 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
15e50 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20 20 20  ble "tab2".     
15e60 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d   */.      addr =
15e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15e80 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
15e90 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29  emeral, tab2, 0)
15ea0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15eb0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15ec0 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
15ed0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
15ee0 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[1] = addr;.   
15ef0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
15f00 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
15f10 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
15f20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
15f30 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
15f40 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
15f50 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
15f60 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65  0;.      interse
15f70 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d  ctdest.iSDParm =
15f80 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70   tab2;.      exp
15f90 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
15fa0 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
15fb0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
15fc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15fd0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
15fe0 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
15ff0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16000 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
16010 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74   );.      pDelet
16020 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
16030 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
16040 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
16050 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
16060 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74  >pPrior->nSelect
16070 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
16080 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
16090 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
160a0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
160b0 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
160c0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
160d0 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
160e0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
160f0 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f  Offset;..      /
16100 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16110 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65  to take the inte
16120 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  rsection of the 
16130 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  two temporary.  
16140 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20      ** tables.. 
16150 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
16160 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
16170 29 3b 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20  );.      iBreak 
16180 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
16190 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
161a0 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
161b0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
161c0 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
161d0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
161e0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
161f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16200 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16210 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
16220 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
16230 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 72 31  age(v);.      r1
16240 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
16250 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
16260 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
16270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16280 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 74 61  , OP_RowData, ta
16290 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  b1, r1);.      s
162a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
162b0 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75  Int(v, OP_NotFou
162c0 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c  nd, tab2, iCont,
162d0 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43 6f 76   r1, 0); VdbeCov
162e0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
162f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16300 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16310 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
16320 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
16330 20 70 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20   p, tab1,.      
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16350 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
16360 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
16370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
16380 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
16390 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ont);.      sqli
163a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
163b0 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
163c0 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
163d0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
163e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
163f0 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
16400 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
16410 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16420 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
16430 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16450 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
16460 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16470 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c     }.  }..  expl
16480 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
16490 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
164a0 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21  1, iSub2, p->op!
164b0 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  =TK_ALL);..  /* 
164c0 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
164d0 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
164e0 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
164f0 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
16500 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
16510 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
16520 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
16530 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
16540 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
16550 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
16560 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
16570 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
16580 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
16590 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
165a0 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
165b0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
165c0 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
165d0 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
165e0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
165f0 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
16600 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
16610 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
16620 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
16630 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
16640 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
16650 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
16660 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16670 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
16680 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
166b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
166c0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
166d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
166e0 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
166f0 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
16700 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
16710 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
16720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
16730 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
16740 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
16750 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
16760 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
16770 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
16780 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
16790 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
167a0 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
167b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
167c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
167d0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
167e0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
167f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e 65    assert( p->pNe
16800 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f  xt==0 );.    nCo
16810 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
16820 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Expr;.    pKeyIn
16830 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
16840 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f  nfoAlloc(db, nCo
16850 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21  l, 1);.    if( !
16860 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20  pKeyInfo ){.    
16870 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
16880 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
16890 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
168a0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
168b0 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
168c0 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
168d0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
168e0 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
168f0 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
16900 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
16910 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
16920 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
16930 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
16940 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
16950 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
16960 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
16970 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
16980 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
16990 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
169a0 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
169b0 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
169c0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
169d0 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
169e0 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
169f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
16a00 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
16a10 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
16a20 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
16a30 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
16a40 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
16a50 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
16a60 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
16a70 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
16a80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16a90 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
16aa0 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
16ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
16ad0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16ae0 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
16af0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16b00 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
16b10 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71   addr, (char*)sq
16b20 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
16b30 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20  pKeyInfo),.     
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b50 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
16b60 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
16b70 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
16b80 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
16b90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16ba0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
16bb0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
16bc0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
16bd0 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
16be0 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
16bf0 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
16c00 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
16c10 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
16c20 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
16c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
16c40 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16c50 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
16c60 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72  ECT */../*.** Er
16c70 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20  ror message for 
16c80 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72 65  when two or more
16c90 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d 70   terms of a comp
16ca0 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76 65  ound select have
16cb0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73 69   different.** si
16cc0 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ze result sets..
16cd0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
16ce0 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72  electWrongNumTer
16cf0 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a 70  msError(Parse *p
16d00 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
16d10 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  ){.  if( p->selF
16d20 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
16d30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
16d40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
16d50 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74  "all VALUES must
16d60 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
16d70 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29  umber of terms")
16d80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
16d90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
16da0 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20  Parse, "SELECTs 
16db0 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  to the left and 
16dc0 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20  right of %s".   
16dd0 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65     " do not have
16de0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
16df0 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
16e00 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  ns", selectOpNam
16e10 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 7d  e(p->op));.  }.}
16e20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
16e30 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
16e40 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e  e for a coroutin
16e50 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
16e60 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   of a.** SELECT 
16e70 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  statment..**.** 
16e80 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f  The data to be o
16e90 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e  utput is contain
16ea0 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74  ed in pIn->iSdst
16eb0 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20  .  There are.** 
16ec0 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d  pIn->nSdst colum
16ed0 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e  ns to be output.
16ee0 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65    pDest is where
16ef0 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75   the output shou
16f00 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a  ld.** be sent..*
16f10 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69  *.** regReturn i
16f20 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
16f30 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  the register hol
16f40 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74  ding the subrout
16f50 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64  ine.** return ad
16f60 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dress..**.** If 
16f70 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69  regPrev>0 then i
16f80 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72  t is the first r
16f90 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63  egister in a vec
16fa0 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f  tor that.** reco
16fb0 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  rds the previous
16fc0 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65   output.  mem[re
16fd0 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67  gPrev] is a flag
16fe0 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a   that is false.*
16ff0 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  * if there has b
17000 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20  een no previous 
17010 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50  output.  If regP
17020 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20  rev>0 then code 
17030 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  is.** generated 
17040 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c  to suppress dupl
17050 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66  icates.  pKeyInf
17060 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f  o is used for co
17070 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e  mparing.** keys.
17080 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49  .**.** If the LI
17090 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e  MIT found in p->
170a0 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65  iLimit is reache
170b0 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  d, jump immediat
170c0 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b  ely to.** iBreak
170d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
170e0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
170f0 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73  broutine(.  Pars
17100 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
17110 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
17120 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
17130 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
17140 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
17150 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
17160 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e   SelectDest *pIn
17170 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f  ,        /* Coro
17180 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20  utine supplying 
17190 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
171a0 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
171b0 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65    /* Where to se
171c0 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20  nd the data */. 
171d0 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20   int regReturn, 
171e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
171f0 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  return address r
17200 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
17210 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20   regPrev,       
17220 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
17230 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72   result register
17240 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73  .  No uniqueness
17250 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e   if 0 */.  KeyIn
17260 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
17270 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72     /* For compar
17280 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75  ing with previou
17290 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74  s entry */.  int
172a0 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20   iBreak         
172b0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
172c0 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20  e if we hit the 
172d0 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64  LIMIT */.){.  Vd
172e0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
172f0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f  pVdbe;.  int iCo
17300 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64  ntinue;.  int ad
17310 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71  dr;..  addr = sq
17320 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17330 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74  Addr(v);.  iCont
17340 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64  inue = sqlite3Vd
17350 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
17360 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64  .  /* Suppress d
17370 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e  uplicates for UN
17380 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
17390 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f   INTERSECT .  */
173a0 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29  .  if( regPrev )
173b0 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c  {.    int addr1,
173c0 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64 72   addr2;.    addr
173d0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
173e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
173f0 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64 62  t, regPrev); Vdb
17400 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17410 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
17420 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17430 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d 3e  P_Compare, pIn->
17440 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
17450 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20 20  , pIn->nSdst,.  
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
17480 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
17490 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
174a0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
174b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
174c0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
174d0 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75  ddr2+2, iContinu
174e0 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64 62  e, addr2+2); Vdb
174f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
17500 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
17510 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
17520 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17530 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
17540 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72  y, pIn->iSdst, r
17550 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e  egPrev+1, pIn->n
17560 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c  Sdst-1);.    sql
17570 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17580 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
17590 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20   regPrev);.  }. 
175a0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d   if( pParse->db-
175b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
175c0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
175d0 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72  Suppress the fir
175e0 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65  st OFFSET entrie
175f0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  s if there is an
17600 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20   OFFSET clause. 
17610 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74   */.  codeOffset
17620 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
17630 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 61  iContinue);..  a
17640 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
17650 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
17660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  );.  assert( pDe
17670 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 54  st->eDest!=SRT_T
17680 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63 68  able );.  switch
17690 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29  ( pDest->eDest )
176a0 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  {.    /* Store t
176b0 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
176c0 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
176d0 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
176e0 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
176f0 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
17700 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
17710 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
17720 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
17730 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
17740 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
17750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17760 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
17770 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  rd, pIn->iSdst, 
17780 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b  pIn->nSdst, r1);
17790 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
177a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
177b0 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
177c0 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  iSDParm, r2);.  
177d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
177e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
177f0 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  rt, pDest->iSDPa
17800 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
17810 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
17820 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
17830 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
17840 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17850 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32  mpReg(pParse, r2
17860 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17870 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17880 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
17890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
178a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
178b0 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
178c0 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
178d0 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
178e0 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
178f0 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20 20  LECT ...)"..    
17900 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17910 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Set: {.      int
17920 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74 63   r1;.      testc
17930 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3e  ase( pIn->nSdst>
17940 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  1 );.      r1 = 
17950 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
17960 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
17970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17980 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
17990 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
179a0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20 20   pIn->nSdst, .  
179b0 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73          r1, pDes
179c0 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49 6e  t->zAffSdst, pIn
179d0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
179e0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
179f0 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
17a00 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
17a10 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17a30 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
17a40 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
17a50 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 0a  t->iSDParm, r1,.
17a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a70 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d 3e             pIn->
17a80 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17a90 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17aa0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17ab0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
17ac0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17ad0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
17ae0 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
17af0 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
17b00 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
17b10 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
17b20 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
17b30 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
17b40 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
17b50 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
17b60 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
17b70 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
17b80 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
17b90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17ba0 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c 20  In->nSdst==1 || 
17bb0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
17bc0 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49 6e  ;  testcase( pIn
17bd0 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20 20  ->nSdst!=1 );.  
17be0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17bf0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
17c00 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
17c10 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
17c20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
17c30 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
17c40 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
17c50 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
17c60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17c70 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
17c80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
17c90 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
17ca0 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
17cb0 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
17cc0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
17cd0 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
17ce0 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
17cf0 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
17d00 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
17d10 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
17d20 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
17d30 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
17d40 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
17d50 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
17d60 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
17d70 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
17d80 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
17d90 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
17da0 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
17db0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
17dc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
17dd0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
17de0 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
17df0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17e00 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
17e10 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17e20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
17e30 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
17e40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
17e50 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66     /* If none of
17e60 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e   the above, then
17e70 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73 74   the result dest
17e80 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a  ination must be.
17e90 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75      ** SRT_Outpu
17ea0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
17eb0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
17ec0 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a   with any other.
17ed0 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69      ** destinati
17ee0 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
17ef0 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61  e ones handled a
17f00 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70  bove or SRT_Outp
17f10 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ut..    **.    *
17f20 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  * For SRT_Output
17f30 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  , results are st
17f40 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
17f50 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
17f60 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74    .    ** Then t
17f70 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20  he OP_ResultRow 
17f80 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74  opcode is used t
17f90 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f  o cause sqlite3_
17fa0 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a  step() to.    **
17fb0 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   return the next
17fc0 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a   row of result..
17fd0 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75      */.    defau
17fe0 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  lt: {.      asse
17ff0 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  rt( pDest->eDest
18000 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
18010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18020 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
18030 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53  sultRow, pIn->iS
18040 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
18050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18060 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
18070 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
18080 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
18090 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72  nSdst);.      br
180a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
180b0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
180c0 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
180d0 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
180e0 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20   reached..  */. 
180f0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
18100 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
18110 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
18120 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69  crJumpZero, p->i
18130 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
18140 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
18150 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
18160 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
18170 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
18180 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18190 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
181a0 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
181b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
181c0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
181d0 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
181e0 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
181f0 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
18200 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
18210 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
18220 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
18230 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
18240 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
18250 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
18260 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
18270 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
18280 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
18290 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
182a0 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
182b0 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
182c0 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
182d0 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
182e0 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
182f0 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
18300 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
18310 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
18320 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
18330 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
18340 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
18350 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
18360 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
18370 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
18380 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
18390 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
183a0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
183b0 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
183c0 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
183d0 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
183e0 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
183f0 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
18400 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
18410 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
18420 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
18430 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
18440 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
18450 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
18460 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
18470 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
18480 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
18490 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
184a0 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
184b0 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
184c0 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
184d0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
184e0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
184f0 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
18500 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
18510 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
18520 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
18530 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
18540 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
18550 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
18560 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
18570 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
18580 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
18590 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
185a0 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
185b0 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
185c0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
185d0 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
185e0 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
185f0 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
18600 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
18610 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
18620 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
18630 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
18640 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
18650 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
18660 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
18670 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
18680 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
18690 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
186a0 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
186b0 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
186c0 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
186d0 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
186e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
186f0 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
18700 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
18710 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
18720 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
18730 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
18740 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
18750 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
18760 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
18770 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
18780 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
18790 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
187a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
187b0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
187c0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
187d0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
187e0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
187f0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
18800 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
18810 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
18820 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
18830 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
18840 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
18850 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
18860 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
18870 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
18880 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
18890 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
188a0 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
188b0 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
188c0 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
188d0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
188e0 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
188f0 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
18900 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
18910 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
18920 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
18930 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
18940 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
18950 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
18960 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
18970 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
18980 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
18990 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
189a0 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
189b0 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
189c0 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
189d0 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
189e0 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
189f0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
18a00 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
18a10 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
18a20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
18a30 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
18a40 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
18a50 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
18a60 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
18a70 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
18a80 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
18a90 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
18aa0 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
18ab0 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
18ac0 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
18ad0 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
18ae0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
18af0 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
18b00 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
18b10 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
18b20 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
18b30 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
18b40 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
18b50 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
18b60 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
18b70 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
18b80 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
18b90 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
18ba0 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
18bb0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
18bc0 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
18bd0 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
18be0 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
18bf0 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
18c00 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
18c10 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
18c20 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
18c30 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
18c40 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
18c50 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
18c60 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
18c70 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
18c80 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
18c90 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
18ca0 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
18cb0 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
18cc0 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
18cd0 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
18ce0 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
18cf0 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
18d00 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
18d10 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
18d20 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
18d30 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
18d40 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
18d50 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
18d60 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
18d70 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
18d80 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
18d90 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
18da0 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
18db0 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
18dc0 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
18dd0 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
18de0 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
18df0 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
18e00 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
18e10 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
18e20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
18e30 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
18e40 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
18e50 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
18e60 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
18e70 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
18e80 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
18e90 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
18ea0 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
18eb0 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
18ec0 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
18ed0 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
18ee0 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
18ef0 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
18f00 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
18f10 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
18f20 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
18f30 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
18f40 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
18f50 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18f60 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
18f70 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
18f80 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
18f90 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
18fa0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
18fb0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
18fc0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18fe0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
18ff0 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
19000 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
19010 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
19020 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
19030 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
19040 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
19050 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
19060 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
19070 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
19080 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
19090 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
190a0 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
190b0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
190c0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
190d0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
190e0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
190f0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
19100 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
19110 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
19120 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
19130 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
19140 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
19150 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
19160 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
19170 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
19180 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
19190 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
191a0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
191b0 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
191c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
191d0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
191e0 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
191f0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
19200 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
19210 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
19220 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
19230 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
19240 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
19250 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
19260 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
19270 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
19280 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
19290 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
192a0 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
192b0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
192c0 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
192d0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
192e0 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
192f0 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
19300 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
19310 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
19320 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
19330 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
19340 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19350 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
19360 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19370 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
19380 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19390 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
193a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
193b0 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
193c0 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
193d0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
193e0 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41  fA_noB;     /* A
193f0 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66  lternate addrEof
19400 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74  A if B is uninit
19410 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  ialized */.  int
19420 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
19430 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
19440 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
19450 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
19460 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
19470 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
19480 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
19490 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
194a0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
194b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
194c0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
194d0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
194e0 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
194f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19500 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
19510 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19520 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
19530 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
19540 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
19550 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
19560 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
19570 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
19580 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
19590 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
195a0 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
195b0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
195c0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
195d0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
195e0 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
195f0 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
19600 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
19610 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
19620 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
19630 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
19640 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
19650 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
19660 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
19670 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
19680 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
19690 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
196a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
196b0 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
196c0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
196d0 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
196e0 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
196f0 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
19700 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
19710 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
19720 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
19730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
19740 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
19750 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
19760 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
19770 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
19780 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
19790 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
197a0 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
197b0 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
197c0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
197d0 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
197e0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
197f0 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
19800 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
19810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
19820 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
19830 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
19840 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
19850 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19860 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
19870 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
19880 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
19890 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
198a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
198b0 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
198c0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
198d0 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
198e0 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
198f0 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
19900 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
19910 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
19920 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
19930 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
19940 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
19950 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
19960 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
19970 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
19980 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
19990 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
199a0 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
199b0 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
199c0 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
199d0 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
199e0 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
199f0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
19a00 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
19a10 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
19a20 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
19a30 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
19a40 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
19a50 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
19a60 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
19a70 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
19a80 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
19a90 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
19aa0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
19ab0 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
19ac0 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
19ad0 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
19ae0 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
19af0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
19b00 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
19b10 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
19b20 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
19b30 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
19b40 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
19b50 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
19b60 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
19b70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
19b80 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
19b90 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
19ba0 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
19bb0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
19bc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
19bd0 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
19be0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
19bf0 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
19c00 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
19c10 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
19c20 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
19c30 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
19c40 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
19c50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
19c60 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
19c70 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
19c80 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
19c90 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
19ca0 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
19cb0 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
19cc0 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
19cd0 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
19ce0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19cf0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
19d00 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
19d10 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
19d20 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
19d30 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
19d40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
19d50 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
19d60 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
19d70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
19d80 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
19d90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
19da0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
19db0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
19dc0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
19dd0 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
19de0 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
19df0 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
19e00 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72  ;.        p->pOr
19e10 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
19e20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
19e30 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
19e40 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
19e50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
19e60 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
19e70 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
19e80 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
19e90 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
19ea0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
19eb0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
19ec0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
19ed0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
19ee0 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
19ef0 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
19f00 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
19f10 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
19f20 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
19f30 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
19f40 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
19f50 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
19f60 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
19f70 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
19f80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
19f90 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
19fa0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
19fb0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
19fc0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
19fd0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
19fe0 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
19ff0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
1a000 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
1a010 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
1a020 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
1a030 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
1a040 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b  (nOrderBy + 1));
1a050 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
1a060 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
1a070 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1a080 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65  em;.    aPermute
1a090 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  [0] = nOrderBy;.
1a0a0 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74      for(i=1, pIt
1a0b0 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
1a0c0 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  i<=nOrderBy; i++
1a0d0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1a0e0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1a0f0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1a100 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
1a110 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1a120 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70  OrderByCol<=p->p
1a130 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1a140 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
1a150 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  ] = pItem->u.x.i
1a160 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a  OrderByCol - 1;.
1a170 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
1a180 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  rge = multiSelec
1a190 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
1a1a0 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
1a1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
1a1c0 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
1a1d0 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
1a1e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1a1f0 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
1a200 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
1a210 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1a220 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1a230 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1a240 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
1a250 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
1a260 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1a270 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
1a280 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
1a290 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
1a2a0 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
1a2b0 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
1a2c0 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
1a2d0 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
1a2e0 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
1a2f0 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
1a300 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
1a310 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
1a320 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
1a330 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1a340 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
1a350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1a360 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
1a370 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1a380 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
1a390 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
1a3a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1a3b0 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
1a3c0 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1a3d0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1a3e0 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71   nExpr+1;.    sq
1a3f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a400 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1a410 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
1a420 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
1a430 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
1a440 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  , nExpr, 1);.   
1a450 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
1a460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
1a470 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
1a480 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29  iteable(pKeyDup)
1a490 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1a4a0 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
1a4b0 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
1a4c0 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
1a4d0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
1a4e0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
1a4f0 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1a500 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1a510 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1a520 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
1a530 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
1a540 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
1a550 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
1a560 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
1a570 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69  rior = 0;.  pPri
1a580 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  or->pNext = 0;. 
1a590 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
1a5a0 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
1a5b0 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
1a5c0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1a5d0 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
1a5e0 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
1a5f0 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
1a600 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1a610 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
1a620 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1a630 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
1a640 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
1a650 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
1a660 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
1a670 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
1a680 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
1a690 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
1a6a0 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1a6b0 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
1a6c0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1a6d0 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
1a6e0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1a6f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a700 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
1a710 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
1a720 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
1a730 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
1a760 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1a770 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1a780 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
1a790 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
1a7a0 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
1a7b0 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
1a7c0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1a7d0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1a7e0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
1a7f0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73  >pLimit = 0;.  s
1a800 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1a810 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29  (db, p->pOffset)
1a820 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  ;.  p->pOffset =
1a830 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20   0;..  regAddrA 
1a840 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a850 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b  ;.  regAddrB = +
1a860 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1a870 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61   regOutA = ++pPa
1a880 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1a890 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutB = ++pParse-
1a8a0 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
1a8b0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
1a8c0 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
1a8d0 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
1a8e0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1a8f0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c  DestInit(&destB,
1a900 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
1a910 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
1a920 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
1a930 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
1a940 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1a950 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
1a960 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
1a970 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
1a980 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
1a990 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  t..  */.  addrSe
1a9a0 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
1a9b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1a9c0 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1a9d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a9e0 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1a9f0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
1aa00 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
1aa10 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1aa20 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
1aa30 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
1aa40 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
1aa50 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
1aa60 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
1aa70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
1aa80 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
1aa90 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
1aaa0 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
1aab0 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64    sqlite3VdbeEnd
1aac0 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67  Coroutine(v, reg
1aad0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
1aae0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1aaf0 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20 47   addr1);..  /* G
1ab00 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
1ab10 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
1ab20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1ab30 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
1ab40 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
1ab50 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
1ab60 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
1ab70 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1ab80 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1ab90 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1aba0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1abb0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1abc0 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72 53  gAddrB, 0, addrS
1abd0 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65 43  electB);.  VdbeC
1abe0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67 68  omment((v, "righ
1abf0 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73  t SELECT"));.  s
1ac00 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
1ac10 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
1ac20 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
1ac30 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
1ac40 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
1ac50 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
1ac60 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
1ac70 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
1ac80 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
1ac90 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1aca0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
1acb0 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  estB);.  p->iLim
1acc0 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
1acd0 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
1ace0 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
1acf0 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72  qlite3VdbeEndCor
1ad00 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64  outine(v, regAdd
1ad10 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
1ad20 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
1ad30 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
1ad40 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
1ad50 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65   the A.  ** sele
1ad60 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
1ad70 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
1ad80 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1ad90 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
1ada0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75  pComment((v, "Ou
1adb0 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  tput routine for
1adc0 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74   A"));.  addrOut
1add0 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  A = generateOutp
1ade0 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
1adf0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1ae00 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c        p, &destA,
1ae10 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c   pDest, regOutA,
1ae20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ae30 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
1ae40 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
1ae50 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
1ae60 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
1ae70 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
1ae80 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
1ae90 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
1aea0 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
1aeb0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
1aec0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
1aed0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1aee0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
1aef0 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
1af00 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1af10 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
1af20 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
1af30 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
1af40 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
1af50 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1af60 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
1af70 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
1af80 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
1af90 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
1afa0 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
1afb0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1afc0 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65  KeyInfoUnref(pKe
1afd0 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  yDup);..  /* Gen
1afe0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1aff0 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
1b000 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
1b010 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72  select A.  ** ar
1b020 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
1b030 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
1b040 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20  ect B remains.. 
1b050 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1b060 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
1b070 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1b080 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1b090 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61 62  = addrEofA = lab
1b0a0 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20  elEnd;.  }else{ 
1b0b0 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f   .    VdbeNoopCo
1b0c0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41  mment((v, "eof-A
1b0d0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1b0e0 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
1b0f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b100 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1b110 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1b120 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e  ;.    addrEofA_n
1b130 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  oB = sqlite3Vdbe
1b140 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b150 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c 61  ld, regAddrB, la
1b160 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20 20  belEnd);.       
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 64                Vd
1b190 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
1b1a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
1b1b0 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29 3b  to(v, addrEofA);
1b1c0 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
1b1d0 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
1b1e0 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
1b1f0 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
1b200 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20  lectRow);.  }.. 
1b210 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1b220 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
1b230 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
1b240 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
1b250 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
1b260 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
1b270 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
1b280 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
1b290 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1b2a0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1b2b0 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
1b2c0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
1b2d0 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53  Row > pPrior->nS
1b2e0 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
1b2f0 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
1b300 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
1b310 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
1b320 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b330 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
1b340 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
1b350 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = 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 20 20 73 71  ddrOutA);.    sq
1b390 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b3a0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b3b0 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29  AddrA, labelEnd)
1b3c0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b3d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1b3e0 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f  beGoto(v, addrEo
1b3f0 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fB);.  }..  /* G
1b400 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1b410 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
1b420 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64  of A<B.  */.  Vd
1b430 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b440 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75  , "A-lt-B subrou
1b450 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
1b460 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ltB = sqlite3Vdb
1b470 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1b480 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
1b490 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74  drOutA);.  sqlit
1b4a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b4b0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1b4c0 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
1b4d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b4e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1b4f0 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1b500 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b510 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74  code to handle t
1b520 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a  he case of A==B.
1b530 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1b540 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64  K_ALL ){.    add
1b550 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42  rAeqB = addrAltB
1b560 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
1b570 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1b580 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  {.    addrAeqB =
1b590 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61   addrAltB;.    a
1b5a0 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c  ddrAltB++;.  }el
1b5b0 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  se{.    VdbeNoop
1b5c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65  Comment((v, "A-e
1b5d0 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  q-B subroutine")
1b5e0 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  );.    addrAeqB 
1b5f0 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  =.    sqlite3Vdb
1b600 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1b610 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1b620 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1b630 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
1b640 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1b650 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
1b660 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1b670 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1b680 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
1b690 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
1b6a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
1b6b0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1b6c0 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
1b6d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1b6e0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
1b6f0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
1b700 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
1b710 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b720 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1b730 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
1b740 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
1b750 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b760 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1b770 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56  rB, addrEofB); V
1b780 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b790 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1b7a0 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  o(v, labelCmpr);
1b7b0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65  ..  /* This code
1b7c0 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e   runs once to in
1b7d0 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68  itialize everyth
1b7e0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ing..  */.  sqli
1b7f0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
1b800 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c  v, addr1);.  sql
1b810 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b820 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1b830 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e  ddrA, addrEofA_n
1b840 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  oB); VdbeCoverag
1b850 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b870 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1b880 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1b890 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1b8a0 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
1b8b0 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
1b8c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
1b8d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1b8e0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1b8f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b900 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
1b910 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
1b920 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
1b930 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
1b940 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b950 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
1b960 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65   destA.iSdst, de
1b970 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65  stB.iSdst, nOrde
1b980 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1b9a0 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20  har*)pKeyMerge, 
1b9b0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
1b9c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1b9d0 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52  P5(v, OPFLAG_PER
1b9e0 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  MUTE);.  sqlite3
1b9f0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
1ba00 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c  _Jump, addrAltB,
1ba10 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41   addrAeqB, addrA
1ba20 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  gtB); VdbeCovera
1ba30 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  ge(v);..  /* Jum
1ba40 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f  p to the this po
1ba50 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
1ba60 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75  terminate the qu
1ba70 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ery..  */.  sqli
1ba80 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1ba90 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29  bel(v, labelEnd)
1baa0 3b 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  ;..  /* Reassemb
1bab0 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
1bac0 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
1bad0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
1bae0 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
1baf0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
1bb00 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
1bb10 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1bb20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1bb30 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
1bb40 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
1bb50 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
1bb60 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
1bb70 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  p;..  /*** TBD: 
1bb80 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
1bb90 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
1bba0 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
1bbb0 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
1bbc0 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
1bbd0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
1bbe0 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
1bbf0 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
1bc00 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
1bc10 72 73 65 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a  rse->nErr!=0;.}.
1bc20 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
1bc30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1bc40 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1bc50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1bc60 49 54 5f 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20  IT_VIEW)../* An 
1bc70 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1bc80 53 75 62 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a  SubstContext obj
1bc90 65 63 74 20 64 65 73 63 72 69 62 65 73 20 61 6e  ect describes an
1bca0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 65 64   substitution ed
1bcb0 69 74 0a 2a 2a 20 74 6f 20 62 65 20 70 65 72 66  it.** to be perf
1bcc0 6f 72 6d 65 64 20 6f 6e 20 61 20 70 61 72 73 65  ormed on a parse
1bcd0 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   tree..**.** All
1bce0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
1bcf0 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20  olumns in table 
1bd00 69 54 61 62 6c 65 20 61 72 65 20 74 6f 20 62 65  iTable are to be
1bd10 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 72   replaced by cor
1bd20 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78  responding.** ex
1bd30 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c  pressions in pEL
1bd40 69 73 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ist..*/.typedef 
1bd50 73 74 72 75 63 74 20 53 75 62 73 74 43 6f 6e 74  struct SubstCont
1bd60 65 78 74 20 7b 0a 20 20 50 61 72 73 65 20 2a 70  ext {.  Parse *p
1bd70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
1bd80 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
1bd90 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
1bda0 74 20 69 54 61 62 6c 65 3b 20 20 20 20 20 20 20  t iTable;       
1bdb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61          /* Repla
1bdc0 63 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ce references to
1bdd0 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
1bde0 20 69 6e 74 20 69 4e 65 77 54 61 62 6c 65 3b 20   int iNewTable; 
1bdf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1be00 77 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  w table number *
1be10 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f  /.  int isLeftJo
1be20 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  in;           /*
1be30 20 41 64 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f   Add TK_IF_NULL_
1be40 52 4f 57 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65  ROW opcodes on e
1be50 61 63 68 20 72 65 70 6c 61 63 65 6d 65 6e 74 20  ach replacement 
1be60 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1be70 45 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f  EList;         /
1be80 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 65 78  * Replacement ex
1be90 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53  pressions */.} S
1bea0 75 62 73 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a  ubstContext;../*
1beb0 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
1bec0 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
1bed0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
1bee0 73 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a  st(SubstContext*
1bef0 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
1bf00 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
1bf10 65 6c 65 63 74 28 53 75 62 73 74 43 6f 6e 74 65  elect(SubstConte
1bf20 78 74 2a 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e  xt*, Select*, in
1bf30 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20  t);../*.** Scan 
1bf40 74 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72  through the expr
1bf50 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52  ession pExpr.  R
1bf60 65 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66  eplace every ref
1bf70 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63  erence to.** a c
1bf80 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e  olumn in table n
1bf90 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74  umber iTable wit
1bfa0 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
1bfb0 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e  iColumn-th.** en
1bfc0 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20  try in pEList.  
1bfd0 28 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72  (But leave refer
1bfe0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57  ences to the ROW
1bff0 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e  ID column .** un
1c000 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20  changed.).**.** 
1c010 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1c020 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74  part of the flat
1c030 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65  tening procedure
1c040 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a  .  A subquery.**
1c050 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65   whose result se
1c060 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
1c070 70 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61  pEList appears a
1c080 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  s entry in the.*
1c090 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
1c0a0 20 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74   a SELECT such t
1c0b0 68 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72  hat the VDBE cur
1c0c0 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1c0d0 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61  that.** FORM cla
1c0e0 75 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61  use entry is iTa
1c0f0 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ble.  This routi
1c100 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63  ne makes the nec
1c110 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67  essary .** chang
1c120 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74  es to pExpr so t
1c130 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64 69  hat it refers di
1c140 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f  rectly to the so
1c150 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66  urce table.** of
1c160 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72 61   the subquery ra
1c170 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74 20  ther the result 
1c180 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  set of the subqu
1c190 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45  ery..*/.static E
1c1a0 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28 0a  xpr *substExpr(.
1c1b0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1c1c0 70 53 75 62 73 74 2c 20 20 2f 2a 20 44 65 73 63  pSubst,  /* Desc
1c1d0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ription of the s
1c1e0 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20  ubstitution */. 
1c1f0 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
1c200 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20          /* Expr 
1c210 69 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74  in which substit
1c220 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a  ution occurs */.
1c230 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
1c240 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1c250 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
1c260 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
1c270 6f 6d 4a 6f 69 6e 29 20 26 26 20 70 45 78 70 72  omJoin) && pExpr
1c280 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1c290 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1c2a0 65 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  e ){.    pExpr->
1c2b0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1c2c0 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61  = pSubst->iNewTa
1c2d0 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ble;.  }.  if( p
1c2e0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
1c2f0 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
1c300 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1c310 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20  able ){.    if( 
1c320 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30  pExpr->iColumn<0
1c330 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1c340 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
1c350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c360 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Expr *pNew;.    
1c370 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20    Expr *pCopy = 
1c380 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1c390 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
1c3a0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45  ].pExpr;.      E
1c3b0 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20  xpr ifNullRow;. 
1c3c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1c3d0 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26  bst->pEList!=0 &
1c3e0 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
1c3f0 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d  <pSubst->pEList-
1c400 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1c410 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
1c420 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
1c430 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1c440 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1c450 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f  ExprIsVector(pCo
1c460 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  py) ){.        s
1c470 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
1c480 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61  rMsg(pSubst->pPa
1c490 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20  rse, pCopy);.   
1c4a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c4b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1c4c0 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e  pSubst->pParse->
1c4d0 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  db;.        if( 
1c4e0 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f  pSubst->isLeftJo
1c4f0 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21  in && pCopy->op!
1c500 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1c510 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
1c520 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69  ifNullRow, 0, si
1c530 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29  zeof(ifNullRow))
1c540 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75  ;.          ifNu
1c550 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46  llRow.op = TK_IF
1c560 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20  _NULL_ROW;.     
1c570 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70       ifNullRow.p
1c580 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20  Left = pCopy;.  
1c590 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f          ifNullRo
1c5a0 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73  w.iTable = pSubs
1c5b0 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20  t->iNewTable;.  
1c5c0 20 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20          pCopy = 
1c5d0 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20  &ifNullRow;.    
1c5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
1c5f0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1c600 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30  Dup(db, pCopy, 0
1c610 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1c620 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69  New && pSubst->i
1c630 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  sLeftJoin ){.   
1c640 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
1c650 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
1c660 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20  CanBeNull);.    
1c670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1c680 28 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61  ( pNew && ExprHa
1c690 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1c6a0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1c6b0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
1c6c0 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
1c6d0 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  = pExpr->iRightJ
1c6e0 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  oinTable;.      
1c6f0 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1c700 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f  rty(pNew, EP_Fro
1c710 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  mJoin);.        
1c720 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
1c730 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1c740 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1c750 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
1c760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1c770 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78  lse{.    if( pEx
1c780 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55  pr->op==TK_IF_NU
1c790 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d  LL_ROW && pExpr-
1c7a0 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d  >iTable==pSubst-
1c7b0 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  >iTable ){.     
1c7c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
1c7d0 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1c7e0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45  le;.    }.    pE
1c7f0 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62  xpr->pLeft = sub
1c800 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1c810 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1c820 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
1c830 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1c840 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  st, pExpr->pRigh
1c850 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  t);.    if( Expr
1c860 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1c870 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1c880 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53   ){.      substS
1c890 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45  elect(pSubst, pE
1c8a0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
1c8b0 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
1c8c0 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
1c8d0 73 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  st(pSubst, pExpr
1c8e0 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20  ->x.pList);.    
1c8f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1c900 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Expr;.}.static v
1c910 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1c920 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78  t(.  SubstContex
1c930 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65  t *pSubst, /* De
1c940 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1c950 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f   substitution */
1c960 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
1c970 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st       /* List
1c980 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
1c990 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
1c9a0 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a  bstitutes */.){.
1c9b0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1c9c0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1c9d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1c9e0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1c9f0 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b  ){.    pList->a[
1ca00 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74  i].pExpr = subst
1ca10 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69  Expr(pSubst, pLi
1ca20 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
1ca30 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
1ca40 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
1ca50 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1ca60 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1ca70 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1ca80 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1ca90 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
1caa0 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
1cab0 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69  statement in whi
1cac0 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1cad0 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  itutions */.  in
1cae0 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20  t doPrior       
1caf0 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69      /* Do substi
1cb00 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69  tutes on p->pPri
1cb10 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53  or too */.){.  S
1cb20 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
1cb30 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1cb40 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
1cb50 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
1cb60 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20  return;.  do{.  
1cb70 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1cb80 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73  pSubst, p->pELis
1cb90 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70  t);.    substExp
1cba0 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d  rList(pSubst, p-
1cbb0 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20  >pGroupBy);.    
1cbc0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1cbd0 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42  ubst, p->pOrderB
1cbe0 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69  y);.    p->pHavi
1cbf0 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70  ng = substExpr(p
1cc00 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e  Subst, p->pHavin
1cc10 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72  g);.    p->pWher
1cc20 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  e = substExpr(pS
1cc30 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29  ubst, p->pWhere)
1cc40 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e  ;.    pSrc = p->
1cc50 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  pSrc;.    assert
1cc60 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20  ( pSrc!=0 );.   
1cc70 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1cc80 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
1cc90 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
1cca0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
1ccb0 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1ccc0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
1ccd0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  1);.      if( pI
1cce0 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
1ccf0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62  c ){.        sub
1cd00 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1cd10 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  t, pItem->u1.pFu
1cd20 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a  ncArg);.      }.
1cd30 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1cd40 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20  doPrior && (p = 
1cd50 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b  p->pPrior)!=0 );
1cd60 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1cd70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1cd80 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1cd90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1cda0 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69  MIT_VIEW) */..#i
1cdb0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1cdc0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1cdd0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1cde0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f  ITE_OMIT_VIEW)./
1cdf0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ce00 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c  e attempts to fl
1ce10 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73  atten subqueries
1ce20 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
1ce30 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
1ce40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ce50 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20  returns 1 if it 
1ce60 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e  makes changes an
1ce70 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65  d 0 if no flatte
1ce80 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ning occurs..**.
1ce90 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64  ** To understand
1cea0 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20   the concept of 
1ceb0 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73  flattening, cons
1cec0 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1ced0 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a  ng.** query:.**.
1cee0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
1cef0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79  FROM (SELECT x+y
1cf00 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1cf10 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45  ERE z<100) WHERE
1cf20 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64   a>5.**.** The d
1cf30 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d  efault way of im
1cf40 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  plementing this 
1cf50 71 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63  query is to exec
1cf60 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75  ute the.** subqu
1cf70 65 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74  ery first and st
1cf80 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
1cf90 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  in a temporary t
1cfa0 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75  able, then.** ru
1cfb0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1cfc0 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72  y on that tempor
1cfd0 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73  ary table.  This
1cfe0 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a   requires two.**
1cff0 20 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65   passes over the
1d000 20 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d   data.  Furtherm
1d010 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  ore, because the
1d020 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1d030 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63  .** has no indic
1d040 65 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c  es, the WHERE cl
1d050 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65  ause on the oute
1d060 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62  r query cannot b
1d070 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a  e.** optimized..
1d080 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d090 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  ne attempts to r
1d0a0 65 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73  ewrite queries s
1d0b0 75 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65  uch as the above
1d0c0 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
1d0d0 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c  e flat select, l
1d0e0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1d0f0 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41      SELECT x+y A
1d100 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
1d110 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a  E z<100 AND a>5.
1d120 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67  **.** The code g
1d130 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69  enerated for thi
1d140 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  s simplification
1d150 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20   gives the same 
1d160 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e  result.** but on
1d170 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74  ly has to scan t
1d180 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41  he data once.  A
1d190 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63  nd because indic
1d1a0 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69  es might .** exi
1d1b0 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  st on the table 
1d1c0 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73  t1, a complete s
1d1d0 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20  can of the data 
1d1e0 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69  might be.** avoi
1d1f0 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74  ded..**.** Flatt
1d200 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74  ening is only at
1d210 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c 20 6f  tempted if all o
1d220 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1d230 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
1d240 20 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75    (1)  The subqu
1d250 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
1d260 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
1d270 6f 74 68 20 75 73 65 20 61 67 67 72 65 67 61 74  oth use aggregat
1d280 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  es..**.**   (2) 
1d290 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1d2a0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1d2b0 65 20 6f 72 20 28 32 61 29 20 74 68 65 20 6f 75  e or (2a) the ou
1d2c0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1d2d0 20 61 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20   a join.**      
1d2e0 20 20 61 6e 64 20 28 32 62 29 20 74 68 65 20 6f    and (2b) the o
1d2f0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1d300 6e 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69  not use subqueri
1d310 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  es other than th
1d320 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
1d330 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1d340 75 65 72 79 20 74 68 61 74 20 69 73 20 61 20 63  uery that is a c
1d350 61 6e 64 69 64 61 74 65 20 66 6f 72 20 66 6c 61  andidate for fla
1d360 74 74 65 6e 69 6e 67 2e 20 20 28 32 62 20 69 73  ttening.  (2b is
1d370 0a 2a 2a 20 20 20 20 20 20 20 20 64 75 65 20 74  .**        due t
1d380 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30  o ticket [2f7170
1d390 64 37 33 62 66 39 61 62 66 38 30 5d 20 66 72 6f  d73bf9abf80] fro
1d3a0 6d 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a  m 2015-02-09.).*
1d3b0 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
1d3c0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1d3d0 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1d3e0 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  d of a LEFT JOIN
1d3f0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 28 61  .**        or (a
1d400 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  ) the subquery i
1d410 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 61 20 6a  s not itself a j
1d420 6f 69 6e 20 61 6e 64 20 28 62 29 20 74 68 65 20  oin and (b) the 
1d430 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20  FROM clause.**  
1d440 20 20 20 20 20 20 6f 66 20 74 68 65 20 73 75 62        of the sub
1d450 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 63  query does not c
1d460 6f 6e 74 61 69 6e 20 61 20 76 69 72 74 75 61 6c  ontain a virtual
1d470 20 74 61 62 6c 65 20 61 6e 64 20 28 63 29 20 74   table and (c) t
1d480 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 6f 75  he .**        ou
1d490 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1d4a0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   an aggregate..*
1d4b0 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1d4c0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1d4d0 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1d4e0 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1d4f0 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1d500 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1d510 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1d520 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1d530 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1d540 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1d550 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1d560 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1d570 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1d580 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1d590 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1d5a0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1d5b0 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1d5c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20 54  ..**.**   (6)  T
1d5d0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1d5e0 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61   not use aggrega
1d5f0 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72  tes or the outer
1d600 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1d610 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1d620 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20 54  ..**.**   (7)  T
1d630 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20  he subquery has 
1d640 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
1d650 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71 75  TODO:  For subqu
1d660 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a 2a  eries without.**
1d670 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20 63          A FROM c
1d680 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72 20  lause, consider 
1d690 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63 6c  adding a FROM cl
1d6a0 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73 70  ause with the sp
1d6b0 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
1d6c0 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
1d6d0 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
1d6e0 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
1d6f0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
1d700 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
1d710 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
1d720 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1d730 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1d740 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1d750 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
1d760 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1d770 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1d780 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1d790 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1d7a0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
1d7b0 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
1d7c0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ates..**.**  (**
1d7d0 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  )  Restriction (
1d7e0 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65 64 20  10) was removed 
1d7f0 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e  from the code on
1d800 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75 74 20   2005-02-05 but 
1d810 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 63 63  we.**        acc
1d820 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65 64 20  idently carried 
1d830 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77  the comment forw
1d840 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34 2d 30  ard until 2014-0
1d850 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a  9-15.  Original.
1d860 2a 2a 20 20 20 20 20 20 20 20 74 65 78 74 3a 20  **        text: 
1d870 22 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f  "The subquery do
1d880 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65  es not use aggre
1d890 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74  gates or the out
1d8a0 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20 20 20  er query .**    
1d8b0 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65      does not use
1d8c0 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20   LIMIT.".**.**  
1d8d0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1d8e0 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1d8f0 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1d900 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1d910 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1d920 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1d930 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1d940 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1d950 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1d960 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1d970 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1d980 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1d990 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1d9a0 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1d9b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1d9c0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
1d9d0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1d9e0 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1d9f0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1da00 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
1da10 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1da20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1da30 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
1da40 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1da50 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
1da60 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
1da70 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
1da80 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
1da90 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
1daa0 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
1dab0 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
1dac0 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
1dad0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1dae0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1daf0 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
1db00 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
1db10 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
1db20 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1db30 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1db40 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1db50 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1db60 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1db70 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1db80 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1db90 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
1dba0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
1dbb0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1dbc0 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
1dbd0 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
1dbe0 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
1dbf0 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
1dc00 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
1dc10 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
1dc20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
1dc30 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
1dc40 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1dc50 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
1dc60 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1dc70 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
1dc80 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
1dc90 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
1dca0 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
1dcb0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1dcc0 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
1dcd0 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
1dce0 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
1dcf0 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
1dd00 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
1dd10 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
1dd20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
1dd30 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
1dd40 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
1dd50 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
1dd60 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
1dd70 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1dd80 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
1dd90 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
1dda0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1ddb0 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
1ddc0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
1ddd0 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
1dde0 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
1ddf0 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1de00 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
1de10 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
1de20 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
1de30 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
1de40 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
1de50 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
1de60 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
1de70 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1de80 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
1de90 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
1dea0 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
1deb0 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
1dec0 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
1ded0 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
1dee0 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1def0 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
1df00 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
1df10 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
1df20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
1df30 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
1df40 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
1df50 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
1df60 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
1df70 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
1df80 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
1df90 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
1dfa0 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
1dfb0 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
1dfc0 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
1dfd0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1dfe0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1dff0 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1e000 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
1e010 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
1e020 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
1e030 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
1e040 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
1e050 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1e060 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
1e070 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
1e080 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1e090 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1e0a0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1e0b0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
1e0c0 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
1e0d0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
1e0e0 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1e0f0 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1e100 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
1e110 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
1e120 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
1e130 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
1e140 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
1e150 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
1e160 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
1e170 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
1e180 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
1e190 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1e1a0 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
1e1b0 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
1e1c0 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
1e1d0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
1e1e0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1e1f0 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
1e200 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
1e210 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
1e220 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
1e230 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
1e240 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
1e250 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1e260 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1e270 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1e280 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
1e290 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
1e2a0 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
1e2b0 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29  c])..**.**  (22)
1e2c0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1e2d0 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1e2e0 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  e CTE..**.**  (2
1e2f0 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69  3)  The parent i
1e300 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1e310 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75  e CTE, or the su
1e320 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1e330 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1e340 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20  und query. This 
1e350 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62  restriction is b
1e360 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d  ecause transform
1e370 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
1e380 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f    parent to a co
1e390 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e  mpound query con
1e3a0 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74  fuses the code t
1e3b0 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20  hat handles.**  
1e3c0 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20        recursive 
1e3d0 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69  queries in multi
1e3e0 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Select()..**.** 
1e3f0 20 28 32 34 29 20 20 54 68 65 20 73 75 62 71 75   (24)  The subqu
1e400 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1e410 67 72 65 67 61 74 65 20 74 68 61 74 20 75 73 65  gregate that use
1e420 73 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d  s the built-in m
1e430 69 6e 28 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20  in() or .**     
1e440 20 20 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63     or max() func
1e450 74 69 6f 6e 73 2e 20 20 28 57 69 74 68 6f 75 74  tions.  (Without
1e460 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
1e470 6e 2c 20 61 20 71 75 65 72 79 20 6c 69 6b 65 3a  n, a query like:
1e480 0a 2a 2a 20 20 20 20 20 20 20 20 22 53 45 4c 45  .**        "SELE
1e490 43 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43  CT x FROM (SELEC
1e4a0 54 20 6d 61 78 28 79 29 2c 20 78 20 46 52 4f 4d  T max(y), x FROM
1e4b0 20 74 31 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20   t1)" would not 
1e4c0 6e 65 63 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20  necessarily.**  
1e4d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 68 65        return the
1e4e0 20 76 61 6c 75 65 20 58 20 66 6f 72 20 77 68 69   value X for whi
1e4f0 63 68 20 59 20 77 61 73 20 6d 61 78 69 6d 61 6c  ch Y was maximal
1e500 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  .).**.**.** In t
1e510 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1e520 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1e530 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1e540 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1e550 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
1e560 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
1e570 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
1e580 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
1e590 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
1e5a0 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
1e5b0 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
1e5c0 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
1e5d0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1e5e0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
1e5f0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
1e600 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
1e610 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1e620 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
1e630 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
1e640 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
1e650 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1e660 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
1e670 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
1e680 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
1e690 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
1e6a0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e6b0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
1e6c0 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
1e6d0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
1e6e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
1e6f0 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
1e700 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1e710 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1e720 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1e730 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1e740 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
1e750 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
1e760 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
1e770 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1e780 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1e790 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
1e7a0 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
1e7b0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
1e7c0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
1e7d0 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
1e7e0 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
1e7f0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1e800 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
1e810 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
1e820 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1e830 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1e840 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
1e850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1e860 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1e870 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1e880 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
1e890 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20  *pParent;    /* 
1e8a0 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c  Current UNION AL
1e8b0 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 74  L term of the ot
1e8c0 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  her query */.  S
1e8d0 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20  elect *pSub;    
1e8e0 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20     /* The inner 
1e8f0 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65  query or "subque
1e900 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ry" */.  Select 
1e910 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20  *pSub1;      /* 
1e920 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72  Pointer to the r
1e930 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20  ightmost select 
1e940 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a  in sub-query */.
1e950 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
1e960 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
1e970 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1e980 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20  outer query */. 
1e990 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72   SrcList *pSubSr
1e9a0 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  c;   /* The FROM
1e9b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
1e9c0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
1e9d0 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20   iParent;       
1e9e0 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
1e9f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53  number of the pS
1ea00 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65  ub result set te
1ea10 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  mp table */.  in
1ea20 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d  t iNewParent = -
1ea30 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74  1;/* Replacement
1ea40 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72 65   table for iPare
1ea50 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65  nt */.  int isLe
1ea60 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54  ftJoin = 0; /* T
1ea70 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20 74  rue if pSub is t
1ea80 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
1ea90 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20   a LEFT JOIN */ 
1eaa0 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20 20     .  int i;    
1eab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1eac0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
1ead0 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1eb00 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1eb10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1eb20 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
1eb30 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
1eb40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1eb50 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
1eb60 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
1eb70 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1eb80 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
1eb90 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
1eba0 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
1ebb0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
1ebc0 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55  rior==0 );  /* U
1ebd0 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e  nable to flatten
1ebe0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65   compound querie
1ebf0 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  s */.  if( Optim
1ec00 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1ec10 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
1ec20 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
1ec30 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
1ec40 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
1ec50 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
1ec60 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
1ec70 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
1ec80 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
1ec90 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
1eca0 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
1ecb0 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
1ecc0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1ecd0 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
1ece0 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  ub!=0 );.  if( s
1ecf0 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1ed00 20 20 20 20 69 66 28 20 69 73 41 67 67 20 29 20      if( isAgg ) 
1ed10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed30 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1ed40 72 69 63 74 69 6f 6e 20 28 31 29 20 20 20 2a 2f  riction (1)   */
1ed50 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  .    if( pSrc->n
1ed60 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30  Src>1 ) return 0
1ed70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ed90 74 72 69 63 74 69 6f 6e 20 28 32 61 29 20 20 2a  triction (2a)  *
1eda0 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 57  /.    if( (p->pW
1edb0 68 65 72 65 20 26 26 20 45 78 70 72 48 61 73 50  here && ExprHasP
1edc0 72 6f 70 65 72 74 79 28 70 2d 3e 70 57 68 65 72  roperty(p->pWher
1edd0 65 2c 45 50 5f 53 75 62 71 75 65 72 79 29 29 0a  e,EP_Subquery)).
1ede0 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33       || (sqlite3
1edf0 45 78 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d  ExprListFlags(p-
1ee00 3e 70 45 4c 69 73 74 29 20 26 20 45 50 5f 53 75  >pEList) & EP_Su
1ee10 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 20  bquery)!=0.     
1ee20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c  || (sqlite3ExprL
1ee30 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 4f 72 64  istFlags(p->pOrd
1ee40 65 72 42 79 29 20 26 20 45 50 5f 53 75 62 71 75  erBy) & EP_Subqu
1ee50 65 72 79 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ery)!=0.    ){. 
1ee60 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1eea0 69 63 74 69 6f 6e 20 28 32 62 29 20 20 2a 2f 0a  iction (2b)  */.
1eeb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 53 75      }.  }..  pSu
1eec0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
1eed0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75  c;.  assert( pSu
1eee0 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69  bSrc );.  /* Pri
1eef0 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e  or to version 3.
1ef00 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20  1.2, when LIMIT 
1ef10 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74  and OFFSET had t
1ef20 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73  o be simple cons
1ef30 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20  tants,.  ** not 
1ef40 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1ef50 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65  sions, we allowe
1ef60 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67  d some combining
1ef70 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   of LIMIT and OF
1ef80 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73  FSET.  ** becaus
1ef90 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20  e they could be 
1efa0 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70  computed at comp
1efb0 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77  ile-time.  But w
1efc0 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  hen LIMIT and OF
1efd0 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65  FSET.  ** became
1efe0 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1eff0 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20  ssions, we were 
1f000 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65  forced to add re
1f010 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a  strictions (13).
1f020 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a    ** and (14). *
1f030 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1f040 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69  imit && p->pLimi
1f050 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
1f060 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f070 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a  striction (13) *
1f080 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f  /.  if( pSub->pO
1f090 66 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30  ffset ) return 0
1f0a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f0c0 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a  striction (14) *
1f0d0 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
1f0e0 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75  lags & SF_Compou
1f0f0 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e  nd)!=0 && pSub->
1f100 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65  pLimit ){.    re
1f110 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f140 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f150 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (15) */.  }.  
1f160 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
1f170 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f190 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f1a0 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20  ction (7)  */.  
1f1b0 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
1f1c0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1f1d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1f1e0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f1f0 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20  ction (5)  */.  
1f200 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1f210 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e   && (pSrc->nSrc>
1f220 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20  1 || isAgg) ){. 
1f230 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1f240 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f250 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a  tions (8)(9) */.
1f260 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65    }.  if( (p->se
1f270 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1f280 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71  inct)!=0 && subq
1f290 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20  ueryIsAgg ){.   
1f2a0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1f2b0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1f2c0 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20  on (6)  */.  }. 
1f2d0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1f2e0 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72   && pSub->pOrder
1f2f0 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  By ){.     retur
1f300 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f330 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1f340 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
1f350 69 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70  isAgg && pSub->p
1f360 4f 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e  OrderBy ) return
1f370 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f380 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f390 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20  n (16) */.  if( 
1f3a0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f3b0 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75  p->pWhere ) retu
1f3c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f3d0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1f3e0 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20  n (19) */.  if( 
1f3f0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
1f400 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f410 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29  F_Distinct)!=0 )
1f420 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1f430 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1f440 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a  riction (21) */.
1f450 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
1f460 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f470 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b   SF_Recursive );
1f480 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75  .  testcase( pSu
1f490 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1f4a0 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20  _MinMaxAgg );.  
1f4b0 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
1f4c0 67 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69  gs & (SF_Recursi
1f4d0 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29  ve|SF_MinMaxAgg)
1f4e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1f4f0 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e  ; /* Restriction
1f500 73 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20  s (22) and (24) 
1f510 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
1f520 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1f530 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75  ecursive) && pSu
1f540 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  b->pPrior ){.   
1f550 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65   return 0; /* Re
1f560 73 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a  striction (23) *
1f570 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  /.  }..  /*.  **
1f580 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1f590 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   is the right op
1f5a0 65 72 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20  erand of a LEFT 
1f5b0 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20  JOIN, then the. 
1f5c0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79   ** subquery may
1f5d0 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69   not be a join i
1f5e0 74 73 65 6c 66 2e 20 20 45 78 61 6d 70 6c 65 20  tself.  Example 
1f5f0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1f600 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1f610 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1f620 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1f630 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
1f640 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1f650 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1f660 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1f670 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1f680 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1f690 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
1f6a0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
1f6b0 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
1f6c0 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
1f6d0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
1f6e0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1f6f0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1f700 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
1f710 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a  n the outer.  **
1f720 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1f730 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
1f740 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69 66  This is an artif
1f750 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 20 61  act of the way a
1f760 67 67 72 65 67 61 74 65 73 0a 20 20 2a 2a 20 61  ggregates.  ** a
1f770 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20 74  re processed - t
1f780 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68 61  here is no mecha
1f790 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69 6e  nism to determin
1f7a0 65 20 69 66 20 74 68 65 20 4c 45 46 54 20 4a 4f  e if the LEFT JO
1f7b0 49 4e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 73 68  IN.  ** table sh
1f7c0 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c  ould be all-NULL
1f7d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
1f7e0 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33 30  also tickets #30
1f7f0 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33 33  6, #350, and #33
1f800 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  00..  */.  if( (
1f810 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69  pSubitem->fg.joi
1f820 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
1f830 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c 65  )!=0 ){.    isLe
1f840 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20 20  ftJoin = 1;.    
1f850 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72  if( pSubSrc->nSr
1f860 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20  c>1 || isAgg || 
1f870 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53 72  IsVirtual(pSubSr
1f880 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29 7b  c->a[0].pTab) ){
1f890 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1f8a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1f8b0 28 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  (3) */.    }.  }
1f8c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f8d0 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20  XTRA_IFNULLROW. 
1f8e0 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f 6d 3e   else if( iFrom>
1f8f0 30 20 26 26 20 21 69 73 41 67 67 20 29 7b 0a 20  0 && !isAgg ){. 
1f900 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73     /* Setting is
1f910 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63  LeftJoin to -1 c
1f920 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52  auses OP_IfNullR
1f930 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65  ow opcodes to be
1f940 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 0a 20   generated for. 
1f950 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65 66 65     ** every refe
1f960 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72 65 73  rence to any res
1f970 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  ult column from 
1f980 73 75 62 71 75 65 72 79 20 69 6e 20 61 20 6a 6f  subquery in a jo
1f990 69 6e 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  in, even though.
1f9a0 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20      ** they are 
1f9b0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
1f9c0 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65 73 73  This will stress
1f9d0 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49 66 4e  -test the OP_IfN
1f9e0 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65 2e 20 2a  ullRow opcode. *
1f9f0 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e  /.    isLeftJoin
1fa00 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69   = -1;.  }.#endi
1fa10 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  f..  /* Restrict
1fa20 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
1fa30 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1fa40 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1fa50 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1fa60 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1fa70 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1fa80 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1fa90 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1faa0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1fab0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1fac0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1fad0 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1fae0 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1faf0 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1fb00 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1fb10 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1fb20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1fb30 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1fb40 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1fb50 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
1fb60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
1fb70 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
1fb80 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1fb90 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
1fba0 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
1fbb0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1fbc0 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
1fbd0 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
1fbe0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
1fbf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fc00 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1fc10 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1fc20 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1fc30 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
1fc40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1fc50 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1fc60 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1fc70 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1fc80 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
1fc90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1fca0 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
1fcb0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1fcc0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
1fcd0 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1fce0 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69  nExpr );.      i
1fcf0 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
1fd00 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1fd10 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1fd20 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  )!=0.       || (
1fd30 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
1fd40 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
1fd50 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  LL) .       || p
1fd60 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1fd70 3c 31 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  <1.      ){.    
1fd80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1fd90 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
1fda0 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
1fdb0 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
1fdc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
1fdd0 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20  iction 18. */.  
1fde0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1fdf0 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
1fe00 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
1fe10 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
1fe20 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
1fe30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
1fe40 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
1fe50 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1fe60 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1fe70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1fe80 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
1fe90 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
1fea0 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
1feb0 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
1fec0 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  */.  SELECTTRACE
1fed0 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66 6c  (1,pParse,p,("fl
1fee0 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f 6d  atten %s.%p from
1fef0 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20 20   term %d\n",.   
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff10 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20  pSub->zSelName, 
1ff20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a  pSub, iFrom));..
1ff30 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20 74    /* Authorize t
1ff40 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1ff50 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1ff60 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65 6d  ntext = pSubitem
1ff70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f  ->zName;.  TESTO
1ff80 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65 33  NLY(i =) sqlite3
1ff90 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1ffa0 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c  , SQLITE_SELECT,
1ffb0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65 73   0, 0, 0);.  tes
1ffc0 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54 45  tcase( i==SQLITE
1ffd0 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72 73  _DENY );.  pPars
1ffe0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1fff0 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74  = zSavedAuthCont
20000 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ext;..  /* If th
20010 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
20020 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
20030 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
20040 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f 6e   (by restriction
20050 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31 38  s.  ** 17 and 18
20060 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74 20   above) it must 
20070 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  be a UNION ALL a
20080 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  nd the parent qu
20090 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62  ery must .  ** b
200a0 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  e of the form:. 
200b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
200c0 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20  ECT <expr-list> 
200d0 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72 79  FROM (<sub-query
200e0 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73 65  >) <where-clause
200f0 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c  > .  **.  ** fol
20100 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52 44  lowed by any ORD
20110 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64  ER BY, LIMIT and
20120 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75 73  /or OFFSET claus
20130 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20  es. This block. 
20140 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31 20   ** creates N-1 
20150 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70 61  copies of the pa
20160 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68 6f  rent query witho
20170 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  ut any ORDER BY,
20180 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20   LIMIT or .  ** 
20190 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20 61  OFFSET clauses a
201a0 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f  nd joins them to
201b0 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73   the left-hand-s
201c0 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ide of the origi
201d0 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55  nal.  ** using U
201e0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
201f0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
20200 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
20210 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20   of simple.  ** 
20220 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
20230 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
20240 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a  d sub-query..  *
20250 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a  *.  ** Example:.
20260 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
20270 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a  LECT a+1 FROM (.
20280 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
20290 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT x FROM tab.  
202a0 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
202b0 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
202c0 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 61  SELECT y FROM ta
202d0 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
202e0 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
202f0 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
20300 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20 20  *2) FROM tab2.  
20310 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20 61  **     ) WHERE a
20320 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a 20  !=5 ORDER BY 1. 
20330 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f   **.  ** Transfo
20340 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rmed into:.  **.
20350 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
20360 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  x+1 FROM tab WHE
20370 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE x+1!=5.  **  
20380 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
20390 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b 31  *     SELECT y+1
203a0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
203b0 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  y+1!=5.  **     
203c0 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
203d0 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a     SELECT abs(z*
203e0 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20 57  2)+1 FROM tab2 W
203f0 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31 21  HERE abs(z*2)+1!
20400 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44 45  =5.  **     ORDE
20410 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
20420 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74 68   We call this th
20430 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71  e "compound-subq
20440 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 22  uery flattening"
20450 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75  ..  */.  for(pSu
20460 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  b=pSub->pPrior; 
20470 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62 2d  pSub; pSub=pSub-
20480 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53 65  >pPrior){.    Se
20490 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  lect *pNew;.    
204a0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
204b0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
204c0 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d  ;.    Expr *pLim
204d0 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
204e0 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65      Expr *pOffse
204f0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
20500 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69      Select *pPri
20510 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
20520 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
20530 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  = 0;.    p->pSrc
20540 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72   = 0;.    p->pPr
20550 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ior = 0;.    p->
20560 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
20570 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
20580 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
20590 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
205a0 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 0);.    sqlit
205b0 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
205c0 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c  pNew, pSub->zSel
205d0 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  Name);.    p->pO
205e0 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b  ffset = pOffset;
205f0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
20600 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e   pLimit;.    p->
20610 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
20620 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63  rBy;.    p->pSrc
20630 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e   = pSrc;.    p->
20640 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
20650 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
20660 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
20670 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65  = pPrior;.    }e
20680 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d  lse{.      pNew-
20690 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
206a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
206b0 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70 4e 65  or ) pPrior->pNe
206c0 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  xt = pNew;.     
206d0 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70   pNew->pNext = p
206e0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
206f0 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  r = pNew;.      
20700 53 45 4c 45 43 54 54 52 41 43 45 28 32 2c 70 50  SELECTTRACE(2,pP
20710 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20 20  arse,p,.        
20720 20 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   ("compound-subq
20730 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72 20 63  uery flattener c
20740 72 65 61 74 65 73 20 25 73 2e 25 70 20 61 73 20  reates %s.%p as 
20750 70 65 65 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20  peer\n",.       
20760 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
20770 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
20780 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
20790 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
207a0 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
207b0 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
207c0 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
207d0 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
207e0 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
207f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
20800 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
20810 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
20820 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
20830 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
20840 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
20850 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
20860 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
20870 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
20880 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
20890 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
208a0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
208b0 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
208c0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
208d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
208e0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
208f0 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
20900 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
20910 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
20920 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
20930 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
20940 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
20950 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
20960 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
20970 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
20980 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
20990 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
209a0 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
209b0 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
209c0 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
209d0 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
209e0 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
209f0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
20a00 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
20a10 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
20a20 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
20a30 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
20a40 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
20a50 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
20a60 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
20a70 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
20a80 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
20a90 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
20aa0 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
20ab0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
20ac0 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
20ad0 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
20ae0 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61  ( pTabToDel->nTa
20af0 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  bRef==1 ){.     
20b00 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
20b10 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
20b20 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
20b30 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
20b40 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
20b50 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
20b60 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
20b70 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
20b80 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
20b90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20ba0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61    pTabToDel->nTa
20bb0 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  bRef--;.    }.  
20bc0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
20bd0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
20be0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
20bf0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
20c00 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
20c10 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
20c20 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
20c30 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
20c40 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
20c50 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
20c60 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
20c70 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
20c80 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
20c90 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
20ca0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
20cb0 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
20cc0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
20cd0 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
20ce0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
20cf0 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
20d00 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
20d10 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20d20 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
20d30 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
20d40 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
20d50 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
20d60 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
20d70 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
20d80 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
20d90 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
20da0 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
20db0 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
20dc0 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
20dd0 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
20de0 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
20df0 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
20e00 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
20e10 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
20e20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
20e30 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
20e40 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
20e50 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
20e60 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
20e70 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
20e80 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
20e90 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
20ea0 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
20eb0 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
20ec0 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
20ed0 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
20ee0 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
20ef0 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
20f00 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
20f10 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
20f20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
20f30 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
20f40 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
20f50 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
20f60 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
20f70 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
20f80 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
20f90 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
20fa0 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
20fb0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
20fc0 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
20fd0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
20fe0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
20ff0 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
21000 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
21010 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
21020 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
21030 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
21040 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
21050 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
21060 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21070 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21080 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
21090 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
210a0 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
210b0 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
210c0 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
210d0 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
210e0 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
210f0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
21100 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
21110 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
21120 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21130 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
21140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
21150 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
21160 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
21170 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
21180 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
21190 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
211a0 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
211b0 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
211c0 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
211d0 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
211e0 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
211f0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
21200 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
21210 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
21220 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
21230 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
21240 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
21250 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
21260 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
21270 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
21280 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
21290 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
212a0 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
212b0 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
212c0 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
212d0 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
212e0 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
212f0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
21300 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
21310 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
21320 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
21330 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
21340 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
21350 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
21360 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
21370 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34  FROM clause to 4
21380 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
21390 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69  he middle slot i
213a0 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
213b0 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
213c0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20   to make space. 
213d0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77     ** for the tw
213e0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
213f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
21400 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
21410 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
21420 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
21430 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
21440 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
21450 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
21460 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
21470 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
21480 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
21490 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
214a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
214b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
214c0 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
214d0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
214e0 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
214f0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
21500 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
21510 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
21520 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
21530 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
21540 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
21550 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
21560 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
21570 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
21580 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61  i+iFrom].fg.isTa
21590 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
215a0 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
215b0 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
215c0 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61  i];.      iNewPa
215d0 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e  rent = pSubSrc->
215e0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
215f0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
21600 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
21610 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
21620 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
21630 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
21640 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
21650 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
21660 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
21670 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
21680 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
21690 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
216a0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
216b0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
216c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
216d0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
216e0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
216f0 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
21700 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
21710 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
21720 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
21730 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
21740 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21760 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
21770 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
21780 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
21790 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
217a0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
217b0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
217c0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
217d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
217e0 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
217f0 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
21800 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
21810 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
21820 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
21830 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
21840 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
21850 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
21860 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
21870 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
21880 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
21890 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
218a0 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
218b0 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
218c0 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
218d0 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
218e0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
218f0 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
21900 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
21910 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
21920 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
21930 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
21940 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
21950 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21960 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
21970 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
21980 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
21990 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
219a0 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
219b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
219c0 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
219d0 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
219e0 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
219f0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21a00 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
21a10 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
21a20 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
21a30 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
21a40 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
21a50 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
21a60 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
21a70 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
21a80 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
21a90 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
21aa0 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
21ab0 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
21ac0 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
21ad0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
21ae0 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
21af0 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
21b00 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
21b10 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
21b20 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
21b30 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
21b40 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
21b50 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
21b60 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
21b70 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
21b80 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
21b90 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
21ba0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
21bb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21bc0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
21bd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
21be0 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f  ert( pSub->pPrio
21bf0 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  r==0 );.      pP
21c00 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
21c10 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
21c20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
21c30 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
21c40 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
21c50 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
21c60 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
21c70 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
21c80 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a  >0 ){.      setJ
21c90 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20  oinExpr(pWhere, 
21ca0 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20  iNewParent);.   
21cb0 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75   }.    if( subqu
21cc0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
21cd0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
21ce0 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  t->pHaving==0 );
21cf0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
21d00 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e  pHaving = pParen
21d10 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  t->pWhere;.     
21d20 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
21d30 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20   = pWhere;.     
21d40 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
21d50 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  g = sqlite3ExprA
21d60 6e 64 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20  nd(db, .        
21d70 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
21d80 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76 69  (db, pSub->pHavi
21d90 6e 67 2c 20 30 29 2c 20 70 50 61 72 65 6e 74 2d  ng, 0), pParent-
21da0 3e 70 48 61 76 69 6e 67 0a 20 20 20 20 20 20 29  >pHaving.      )
21db0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21dc0 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
21dd0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
21de0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
21df0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
21e00 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
21e10 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
21e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
21e30 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
21e40 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
21e50 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72 65  b, pWhere, pPare
21e60 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  nt->pWhere);.   
21e70 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
21e80 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
21e90 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
21ea0 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 78 2e  text x;.      x.
21eb0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
21ec0 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20  .      x.iTable 
21ed0 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  = iParent;.     
21ee0 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69   x.iNewTable = i
21ef0 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20  NewParent;.     
21f00 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
21f10 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20 20 20  isLeftJoin;.    
21f20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75    x.pEList = pSu
21f30 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  b->pEList;.     
21f40 20 73 75 62 73 74 53 65 6c 65 63 74 28 26 78 2c   substSelect(&x,
21f50 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20   pParent, 0);.  
21f60 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68    }.  .    /* Th
21f70 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
21f80 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
21f90 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
21fa0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
21fb0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
21fc0 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
21fd0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
21fe0 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
21ff0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
22000 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
22010 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
22020 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
22030 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
22040 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
22050 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
22060 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
22070 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
22080 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
22090 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
220a0 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
220b0 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
220c0 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
220d0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
220e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
220f0 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
22100 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
22110 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
22120 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
22130 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
22140 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
22150 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
22160 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
22170 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
22180 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
22190 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
221a0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
221b0 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66 20 53  , pSub1);..#if S
221c0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
221d0 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
221e0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
221f0 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  100 ){.    SELEC
22200 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
22210 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 66 6c  rse,p,("After fl
22220 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a  attening:\n"));.
22230 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
22240 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
22250 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
22260 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
22270 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
22280 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
22290 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
222a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
222b0 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21  IEW) */....#if !
222c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
222d0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
222e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
222f0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
22300 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
22310 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52 45 20   relevant WHERE 
22320 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
22330 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
22340 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52  into.** the WHER
22350 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  E clause of subq
22360 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a  uery.  Example:.
22370 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
22380 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
22390 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
223a0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 78  FROM t1) WHERE x
223b0 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a  =5 AND y=10;.**.
223c0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
223d0 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nto:.**.**    SE
223e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
223f0 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20  ECT a AS x, c-d 
22400 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45  AS y FROM t1 WHE
22410 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31  RE a=5 AND c-d=1
22420 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52 45 20  0).**     WHERE 
22430 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a  x=5 AND y=10;.**
22440 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69 73 20  .** The hope is 
22450 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 61  that the terms a
22460 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 6e 65  dded to the inne
22470 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b  r query will mak
22480 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66  e it more.** eff
22490 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f  icient..**.** Do
224a0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 69   not attempt thi
224b0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  s optimization i
224c0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54  f:.**.**   (1) T
224d0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
224e0 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20  s an aggregate. 
224f0 20 28 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20   (In that case, 
22500 77 65 27 64 20 72 65 61 6c 6c 79 20 77 61 6e 74  we'd really want
22510 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 63 6f 70  .**       to cop
22520 79 20 74 68 65 20 6f 75 74 65 72 20 57 48 45 52  y the outer WHER
22530 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E-clause terms o
22540 6e 74 6f 20 74 68 65 20 48 41 56 49 4e 47 20 63  nto the HAVING c
22550 6c 61 75 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  lause of the.** 
22560 20 20 20 20 20 20 69 6e 6e 65 72 20 71 75 65 72        inner quer
22570 79 2e 20 20 42 75 74 20 74 68 65 79 20 70 72 6f  y.  But they pro
22580 62 61 62 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70  bably won't help
22590 20 74 68 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74   there so do not
225a0 20 62 6f 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20   bother.).**.** 
225b0 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20    (2) The inner 
225c0 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65 63  query is the rec
225d0 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
225e0 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78   common table ex
225f0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
22600 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20    (3) The inner 
22610 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49  query has a LIMI
22620 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20  T clause (since 
22630 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
22640 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20  he WHERE.**     
22650 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68    close would ch
22660 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67  ange the meaning
22670 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a   of the LIMIT)..
22680 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20  **.**   (4) The 
22690 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74  inner query is t
226a0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
226b0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e   of a LEFT JOIN.
226c0 20 20 28 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a    (The caller.**
226d0 20 20 20 20 20 20 20 65 6e 66 6f 72 63 65 73 20         enforces 
226e0 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  this restriction
226f0 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
22700 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ine does not hav
22710 65 20 65 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20  e enough.**     
22720 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f    information to
22730 20 6b 6e 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   know.).**.**   
22740 28 35 29 20 54 68 65 20 57 48 45 52 45 20 63 6c  (5) The WHERE cl
22750 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
22760 6f 72 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68  originates in th
22770 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  e ON or USING cl
22780 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  ause.**       of
22790 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a   a LEFT JOIN..**
227a0 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
227b0 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  no changes are m
227c0 61 64 65 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  ade and non-zero
227d0 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   if one or more 
227e0 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
227f0 74 65 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63  terms are duplic
22800 61 74 65 64 20 69 6e 74 6f 20 74 68 65 20 73 75  ated into the su
22810 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  bquery..*/.stati
22820 63 20 69 6e 74 20 70 75 73 68 44 6f 77 6e 57 68  c int pushDownWh
22830 65 72 65 54 65 72 6d 73 28 0a 20 20 50 61 72 73  ereTerms(.  Pars
22840 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
22850 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
22860 78 74 20 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29  xt (for malloc()
22870 20 61 6e 64 20 65 72 72 6f 72 20 72 65 70 6f 72   and error repor
22880 74 69 6e 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63  ting) */.  Selec
22890 74 20 2a 70 53 75 62 71 2c 20 20 20 20 20 20 20  t *pSubq,       
228a0 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
228b0 20 77 68 6f 73 65 20 57 48 45 52 45 20 63 6c 61   whose WHERE cla
228c0 75 73 65 20 69 73 20 74 6f 20 62 65 20 61 75 67  use is to be aug
228d0 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  mented */.  Expr
228e0 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
228f0 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
22900 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
22910 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  er query */.  in
22920 74 20 69 43 75 72 73 6f 72 20 20 20 20 20 20 20  t iCursor       
22930 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
22940 6d 62 65 72 20 6f 66 20 74 68 65 20 73 75 62 71  mber of the subq
22950 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  uery */.){.  Exp
22960 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
22970 43 68 6e 67 20 3d 20 30 3b 0a 20 20 53 65 6c 65  Chng = 0;.  Sele
22980 63 74 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  ct *pX;         
22990 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
229a0 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 53   over compound S
229b0 45 4c 45 43 54 73 20 69 6e 20 70 53 75 62 71 20  ELECTs in pSubq 
229c0 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d  */.  if( pWhere=
229d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
229e0 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20 70   for(pX=pSubq; p
229f0 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  X; pX=pX->pPrior
22a00 29 7b 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e  ){.    if( (pX->
22a10 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 41  selFlags & (SF_A
22a20 67 67 72 65 67 61 74 65 7c 53 46 5f 52 65 63 75  ggregate|SF_Recu
22a30 72 73 69 76 65 29 29 21 3d 30 20 29 7b 0a 20 20  rsive))!=0 ){.  
22a40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
22a50 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22a60 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
22a70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
22a80 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
22a90 65 63 75 72 73 69 76 65 20 29 3b 0a 20 20 20 20  ecursive );.    
22aa0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 21 3d    testcase( pX!=
22ab0 70 53 75 62 71 20 29 3b 0a 20 20 20 20 20 20 72  pSubq );.      r
22ac0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
22ad0 72 69 63 74 69 6f 6e 73 20 28 31 29 20 61 6e 64  rictions (1) and
22ae0 20 28 32 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20   (2) */.    }.  
22af0 7d 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e 70  }.  if( pSubq->p
22b00 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20 20  Limit!=0 ){.    
22b10 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73  return 0; /* res
22b20 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a  triction (3) */.
22b30 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57 68    }.  while( pWh
22b40 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20  ere->op==TK_AND 
22b50 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20  ){.    nChng += 
22b60 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
22b70 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 71  ms(pParse, pSubq
22b80 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74  , pWhere->pRight
22b90 2c 20 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  , iCursor);.    
22ba0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d  pWhere = pWhere-
22bb0 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66  >pLeft;.  }.  if
22bc0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
22bd0 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d  y(pWhere,EP_From
22be0 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
22bf0 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
22c00 20 35 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69   5 */.  if( sqli
22c10 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
22c20 6e 73 74 61 6e 74 28 70 57 68 65 72 65 2c 20 69  nstant(pWhere, i
22c30 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e  Cursor) ){.    n
22c40 43 68 6e 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  Chng++;.    whil
22c50 65 28 20 70 53 75 62 71 20 29 7b 0a 20 20 20 20  e( pSubq ){.    
22c60 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 78    SubstContext x
22c70 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73  ;.      pNew = s
22c80 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
22c90 61 72 73 65 2d 3e 64 62 2c 20 70 57 68 65 72 65  arse->db, pWhere
22ca0 2c 20 30 29 3b 0a 20 20 20 20 20 20 78 2e 70 50  , 0);.      x.pP
22cb0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
22cc0 20 20 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20       x.iTable = 
22cd0 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 78  iCursor;.      x
22ce0 2e 69 4e 65 77 54 61 62 6c 65 20 3d 20 69 43 75  .iNewTable = iCu
22cf0 72 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 73  rsor;.      x.is
22d00 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20  LeftJoin = 0;.  
22d10 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
22d20 53 75 62 71 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  Subq->pEList;.  
22d30 20 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74      pNew = subst
22d40 45 78 70 72 28 26 78 2c 20 70 4e 65 77 29 3b 0a  Expr(&x, pNew);.
22d50 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
22d60 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
22d70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
22d80 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20   pSubq->pWhere, 
22d90 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 53 75  pNew);.      pSu
22da0 62 71 20 3d 20 70 53 75 62 71 2d 3e 70 50 72 69  bq = pSubq->pPri
22db0 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  or;.    }.  }.  
22dc0 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a  return nChng;.}.
22dd0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
22de0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
22df0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
22e00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
22e10 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _VIEW) */../*.**
22e20 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   Based on the co
22e30 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67  ntents of the Ag
22e40 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  gInfo structure 
22e50 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
22e60 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
22e70 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nt, this functio
22e80 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20  n checks if the 
22e90 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
22ea0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74  ue:.**.**    * t
22eb0 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e  he query contain
22ec0 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
22ed0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
22ee0 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  on,.**    * the 
22ef0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
22f00 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e  on is either min
22f10 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64  () or max(), and
22f20 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67  .**    * the arg
22f30 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67  ument to the agg
22f40 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
22f50 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
22f60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  e..**.** If all 
22f70 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65  of the above are
22f80 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52   true, then WHER
22f90 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72  E_ORDERBY_MIN or
22fa0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
22fb0 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  AX.** is returne
22fc0 64 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  d as appropriate
22fd0 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61  . Also, *ppMinMa
22fe0 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  x is set to poin
22ff0 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73  t to the .** lis
23000 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  t of arguments p
23010 61 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67  assed to the agg
23020 72 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65  regate before re
23030 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f  turning..**.** O
23040 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74  r, if the condit
23050 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e  ions above are n
23060 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61  ot met, *ppMinMa
23070 78 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  x is set to 0 an
23080 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52  d.** WHERE_ORDER
23090 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74  BY_NORMAL is ret
230a0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
230b0 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28   u8 minMaxQuery(
230c0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
230d0 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  o, ExprList **pp
230e0 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65  MinMax){.  int e
230f0 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45  Ret = WHERE_ORDE
23100 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20  RBY_NORMAL;     
23110 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
23120 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69  alue */..  *ppMi
23130 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20  nMax = 0;.  if( 
23140 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
23150 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  =1 ){.    Expr *
23160 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f  pExpr = pAggInfo
23170 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72  ->aFunc[0].pExpr
23180 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66  ; /* Aggregate f
23190 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45  unction */.    E
231a0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
231b0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
231c0 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  ;      /* Argume
231d0 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74  nts to agg funct
231e0 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ion */..    asse
231f0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
23200 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29  K_AGG_FUNCTION )
23210 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
23220 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
23230 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e  r==1 && pEList->
23240 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d  a[0].pExpr->op==
23250 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b  TK_AGG_COLUMN ){
23260 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
23270 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72  r *zFunc = pExpr
23280 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
23290 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
232a0 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e  ICmp(zFunc, "min
232b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
232c0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
232d0 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20  DERBY_MIN;.     
232e0 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
232f0 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c  EList;.      }el
23300 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
23310 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
23320 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
23330 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
23340 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20  RDERBY_MAX;.    
23350 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20      *ppMinMax = 
23360 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  pEList;.      }.
23370 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
23380 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d  ert( *ppMinMax==
23390 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29  0 || (*ppMinMax)
233a0 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20  ->nExpr==1 );.  
233b0 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a  return eRet;.}..
233c0 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74  /*.** The select
233d0 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65   statement passe
233e0 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
233f0 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67  rgument is an ag
23400 67 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a  gregate query..*
23410 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
23420 75 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73 73  ument is the ass
23430 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61 74  ociated aggregat
23440 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54  e-info object. T
23450 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  his .** function
23460 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53 45   tests if the SE
23470 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20 66  LECT is of the f
23480 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  orm:.**.**   SEL
23490 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
234a0 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68  M <tbl>.**.** wh
234b0 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20 64  ere table is a d
234c0 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e  atabase table, n
234d0 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20  ot a sub-select 
234e0 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65 20  or view. If the 
234f0 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61  query.** does ma
23500 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72 6e  tch this pattern
23510 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
23520 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
23530 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e  ject representin
23540 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65  g.** <tbl> is re
23550 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
23560 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
23570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c  ..*/.static Tabl
23580 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  e *isSimpleCount
23590 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49  (Select *p, AggI
235a0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
235b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
235c0 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20   Expr *pExpr;.. 
235d0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72   assert( !p->pGr
235e0 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20  oupBy );..  if( 
235f0 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e  p->pWhere || p->
23600 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31  pEList->nExpr!=1
23610 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d   .   || p->pSrc-
23620 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70  >nSrc!=1 || p->p
23630 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
23640 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t.  ){.    retur
23650 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20  n 0;.  }.  pTab 
23660 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
23670 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20  pTab;.  pExpr = 
23680 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
23690 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
236a0 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e   pTab && !pTab->
236b0 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70 72  pSelect && pExpr
236c0 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72   );..  if( IsVir
236d0 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65 74  tual(pTab) ) ret
236e0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78  urn 0;.  if( pEx
236f0 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46  pr->op!=TK_AGG_F
23700 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e  UNCTION ) return
23710 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   0;.  if( NEVER(
23720 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d  pAggInfo->nFunc=
23730 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  =0) ) return 0;.
23740 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d    if( (pAggInfo-
23750 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d  >aFunc[0].pFunc-
23760 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54  >funcFlags&SQLIT
23770 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
23780 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
23790 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
237a0 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
237b0 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
237c0 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
237d0 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
237e0 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
237f0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
23800 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
23810 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
23820 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
23830 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
23840 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
23850 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
23860 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
23870 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
23880 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
23890 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
238a0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
238b0 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
238c0 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
238d0 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
238e0 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
238f0 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
23900 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
23910 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
23920 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
23930 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
23940 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
23950 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
23960 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67  Tab && pFrom->fg
23970 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 7b 0a  .isIndexedBy ){.
23980 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
23990 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
239a0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 65     char *zIndexe
239b0 64 42 79 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e  dBy = pFrom->u1.
239c0 7a 49 6e 64 65 78 65 64 42 79 3b 0a 20 20 20 20  zIndexedBy;.    
239d0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
239e0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
239f0 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
23a00 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
23a10 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
23a20 61 6d 65 2c 20 7a 49 6e 64 65 78 65 64 42 79 29  ame, zIndexedBy)
23a30 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d  ; .        pIdx=
23a40 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20  pIdx->pNext.    
23a50 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78  );.    if( !pIdx
23a60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23a70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23a80 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
23a90 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 65 64 42  : %s", zIndexedB
23aa0 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  y, 0);.      pPa
23ab0 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
23ac0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
23ad0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
23ae0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d  .    }.    pFrom
23af0 2d 3e 70 49 42 49 6e 64 65 78 20 3d 20 70 49 64  ->pIBIndex = pId
23b00 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
23b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  SQLITE_OK;.}./*.
23b20 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f 75  ** Detect compou
23b30 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
23b40 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61 6e  ents that use an
23b50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23b60 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74   with .** an alt
23b70 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74 69  ernative collati
23b80 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
23b90 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e  **    SELECT ...
23ba0 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20   FROM t1 EXCEPT 
23bb0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
23bc0 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20 43  t2 ORDER BY .. C
23bd0 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
23be0 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72 69   These are rewri
23bf0 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75 65  tten as a subque
23c00 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  ry:.**.**    SEL
23c10 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
23c20 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
23c30 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
23c40 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20   FROM t2).**    
23c50 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f   ORDER BY ... CO
23c60 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  LLATE ....**.** 
23c70 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
23c80 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
23c90 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75 6c   because the mul
23ca0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
23cb0 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f  ) routine.** abo
23cc0 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  ve that generate
23cd0 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61  s the code for a
23ce0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
23cf0 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
23d00 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73  Y clause.** uses
23d10 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74   a merge algorit
23d20 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65 73  hm that requires
23d30 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74   the same collat
23d40 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e 20  ing sequence on 
23d50 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
23d60 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65 20  lumns as on the 
23d70 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
23d80 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20    See ticket.** 
23d90 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
23da0 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36  e.org/src/info/6
23db0 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20  709574d2a.**.** 
23dc0 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61 74  This transformat
23dd0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64  ion is only need
23de0 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20 49  ed for EXCEPT, I
23df0 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55 4e  NTERSECT, and UN
23e00 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f  ION..** The UNIO
23e10 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77  N ALL operator w
23e20 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20 6d  orks fine with m
23e30 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
23e40 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a  y() even when.**
23e50 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c 41   there are COLLA
23e60 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  TE terms in the 
23e70 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61  ORDER BY..*/.sta
23e80 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74 43  tic int convertC
23e90 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
23ea0 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20 2a  ubquery(Walker *
23eb0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
23ec0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
23ed0 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
23ee0 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73 71  Select *pX;.  sq
23ef0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 72  lite3 *db;.  str
23f00 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
23f10 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74 20  m *a;.  SrcList 
23f20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72 73  *pNewSrc;.  Pars
23f30 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b  e *pParse;.  Tok
23f40 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28  en dummy;..  if(
23f50 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20   p->pPrior==0 ) 
23f60 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23f70 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f  nue;.  if( p->pO
23f80 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
23f90 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
23fa0 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58 20  .  for(pX=p; pX 
23fb0 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41  && (pX->op==TK_A
23fc0 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b  LL || pX->op==TK
23fd0 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d  _SELECT); pX=pX-
23fe0 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28  >pPrior){}.  if(
23ff0 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   pX==0 ) return 
24000 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
24010 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  a = p->pOrderBy-
24020 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70  >a;.  for(i=p->p
24030 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31  OrderBy->nExpr-1
24040 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
24050 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70 72    if( a[i].pExpr
24060 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c  ->flags & EP_Col
24070 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  late ) break;.  
24080 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72 65  }.  if( i<0 ) re
24090 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
240a0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72  e;..  /* If we r
240b0 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
240c0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
240d0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
240e0 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a  s required. */..
240f0 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
24100 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
24110 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
24120 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
24130 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
24140 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
24150 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
24160 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
24170 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 6d  t;.  memset(&dum
24180 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 75  my, 0, sizeof(du
24190 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72 63  mmy));.  pNewSrc
241a0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
241b0 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
241c0 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75  pParse,0,0,0,&du
241d0 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20  mmy,pNew,0,0);. 
241e0 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30 20   if( pNewSrc==0 
241f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
24200 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70  rt;.  *pNew = *p
24210 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e  ;.  p->pSrc = pN
24220 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69  ewSrc;.  p->pELi
24230 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
24240 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
24250 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
24260 72 28 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53  r(db, TK_ASTERIS
24270 4b 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  K, 0));.  p->op 
24280 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
24290 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
242a0 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
242b0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
242c0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
242d0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
242e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
242f0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a    p->pNext = 0;.
24300 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a    p->pWith = 0;.
24310 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
24320 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
24330 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
24340 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
24350 72 74 65 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d  rted)==0 );.  p-
24360 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
24370 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 61 73 73  Converted;.  ass
24380 65 72 74 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f  ert( pNew->pPrio
24390 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e  r!=0 );.  pNew->
243a0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
243b0 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  pNew;.  pNew->pL
243c0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
243d0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
243e0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
243f0 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  inue;.}../*.** C
24400 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
24410 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
24420 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74 61  erm pFrom has ta
24430 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
24440 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73  ion.** arguments
24450 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 6c  .  If it does, l
24460 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
24470 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 20  ssage in pParse 
24480 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  and return.** no
24490 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70 46  n-zero, since pF
244a0 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  rom is not allow
244b0 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c 65  ed to be a table
244c0 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e  -valued function
244d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
244e0 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e  cannotBeFunction
244f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24500 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
24510 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
24520 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 54  f( pFrom->fg.isT
24530 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71  abFunc ){.    sq
24540 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
24550 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20 6e  arse, "'%s' is n
24560 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c 20  ot a function", 
24570 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pFrom->zName);. 
24580 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
24590 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
245a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
245b0 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72  MIT_CTE./*.** Ar
245c0 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68  gument pWith (wh
245d0 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29  ich may be NULL)
245e0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e   points to a lin
245f0 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74  ked list of nest
24600 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74  ed .** WITH cont
24610 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72  exts, from inner
24620 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49   to outermost. I
24630 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  f the table iden
24640 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52  tified by .** FR
24650 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
24660 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c  t pItem is reall
24670 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  y a common-table
24680 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45  -expression (CTE
24690 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  ) .** then retur
246a0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
246b0 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f  he CTE definitio
246c0 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65  n for that table
246d0 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72  . Otherwise.** r
246e0 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
246f0 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  * If a non-NULL 
24700 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65  value is returne
24710 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78  d, set *ppContex
24720 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
24730 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74  e With.** object
24740 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e   that the return
24750 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74  ed CTE belongs t
24760 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  o..*/.static str
24770 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57  uct Cte *searchW
24780 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69  ith(.  With *pWi
24790 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
247a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
247b0 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54 48  t innermost WITH
247c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
247d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
247e0 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20   *pItem,     /* 
247f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
24800 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  ent to resolve *
24810 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e  /.  With **ppCon
24820 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  text            
24830 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48      /* OUT: WITH
24840 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76   clause return v
24850 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20  alue belongs to 
24860 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
24870 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
24880 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
24890 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d  e==0 && (zName =
248a0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d   pItem->zName)!=
248b0 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70  0 ){.    With *p
248c0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74  ;.    for(p=pWit
248d0 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65  h; p; p=p->pOute
248e0 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  r){.      int i;
248f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
24900 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b  i<p->nCte; i++){
24910 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
24920 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
24930 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  e, p->a[i].zName
24940 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
24950 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70    *ppContext = p
24960 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
24970 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20  rn &p->a[i];.   
24980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
24990 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
249a0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  n 0;.}../* The c
249b0 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61  ode generator ma
249c0 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20  intains a stack 
249d0 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63  of active WITH c
249e0 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74  lauses.** with t
249f0 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49  he inner-most WI
24a00 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20  TH clause being 
24a10 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  at the top of th
24a20 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e stack..**.** T
24a30 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68  his routine push
24a40 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75  es the WITH clau
24a50 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  se passed as the
24a60 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
24a70 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70  .** onto the top
24a80 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49   of the stack. I
24a90 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65  f argument bFree
24aa0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
24ab0 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75  his.** WITH clau
24ac0 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  se will never be
24ad0 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
24ae0 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20   stack. In this 
24af0 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c  case it.** shoul
24b00 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  d be freed along
24b10 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20   with the Parse 
24b20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72  object. In other
24b30 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20   cases, when.** 
24b40 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69  bFree==0, the Wi
24b50 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  th object will b
24b60 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69  e freed along wi
24b70 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a  th the SELECT .*
24b80 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68  * statement with
24b90 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73   which it is ass
24ba0 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ociated..*/.void
24bb0 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
24bc0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24bd0 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20  With *pWith, u8 
24be0 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74  bFree){.  assert
24bf0 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28 70  ( bFree==0 || (p
24c00 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20  Parse->pWith==0 
24c10 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  && pParse->pWith
24c20 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20 20  ToFree==0) );.  
24c30 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
24c40 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
24c50 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29 3b  >pWith!=pWith );
24c60 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74  .    pWith->pOut
24c70 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  er = pParse->pWi
24c80 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
24c90 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
24ca0 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20 70     if( bFree ) p
24cb0 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
24cc0 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 0a  ee = pWith;.  }.
24cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24ce0 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
24cf0 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20   argument pFrom 
24d00 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45 20  refers to a CTE 
24d10 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20  declared by .** 
24d20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e  a WITH clause on
24d30 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72 65   the stack curre
24d40 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20  ntly maintained 
24d50 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20 41  by the parser. A
24d60 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e  nd,.** if curren
24d70 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61  tly processing a
24d80 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c   CTE expression,
24d90 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63 75   if it is a recu
24da0 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e  rsive.** referen
24db0 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ce to the curren
24dc0 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  t CTE..**.** If 
24dd0 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f  pFrom falls into
24de0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 74   either of the t
24df0 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61 62  wo categories ab
24e00 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ove, pFrom->pTab
24e10 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69  .** and other fi
24e20 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74  elds are populat
24e30 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
24e40 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
24e50 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f  d check.** (pFro
24e60 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64  m->pTab!=0) to d
24e70 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
24e80 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73   or not a succes
24e90 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61  sful match.** wa
24ea0 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57  s found..**.** W
24eb0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
24ec0 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20  match is found, 
24ed0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
24ee0 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
24ef0 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20  r.** occurs. If 
24f00 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
24f10 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  cur, an error me
24f20 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64 20  ssage is stored 
24f30 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72  in the.** parser
24f40 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20   and some error 
24f50 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20  code other than 
24f60 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
24f70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
24f80 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20  t withExpand(.  
24f90 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
24fa0 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69   .  struct SrcLi
24fb0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29  st_item *pFrom.)
24fc0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
24fd0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
24fe0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rse;.  sqlite3 *
24ff0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
25000 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70  .  struct Cte *p
25010 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cte;            
25020 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54     /* Matched CT
25030 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  E (or NULL if no
25040 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74   match) */.  Wit
25050 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20  h *pWith;       
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25070 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61 74  WITH clause that
25080 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f   pCte belongs to
25090 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
250a0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
250b0 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72 63  ..  pCte = searc
250c0 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57  hWith(pParse->pW
250d0 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69  ith, pFrom, &pWi
250e0 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20  th);.  if( pCte 
250f0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
25100 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ab;.    ExprList
25110 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65   *pEList;.    Se
25120 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20  lect *pSel;.    
25130 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20  Select *pLeft;  
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25150 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   Left-most SELEC
25160 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
25170 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72     int bMayRecur
25180 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  sive;           
25190 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70   /* True if comp
251a0 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55  ound joined by U
251b0 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20  NION [ALL] */.  
251c0 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57 69    With *pSavedWi
251d0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
251e0 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
251f0 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74   of pParse->pWit
25200 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  h */..    /* If 
25210 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73  pCte->zCteErr is
25220 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69   non-NULL at thi
25230 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
25240 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c  is is an illegal
25250 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
25260 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43  e reference to C
25270 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61  TE pCte. Leave a
25280 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
25290 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  e and return.   
252a0 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43   ** early. If pC
252b0 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 4e  te->zCteErr is N
252c0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
252d0 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
252e0 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
252f0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
25300 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
25310 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43 74     if( pCte->zCt
25320 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71  eErr ){.      sq
25330 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25340 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74 65  arse, pCte->zCte
25350 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  Err, pCte->zName
25360 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25370 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25380 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e 6e    }.    if( cann
25390 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61  otBeFunction(pPa
253a0 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
253b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
253c0 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  R;..    assert( 
253d0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
253e0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
253f0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
25400 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
25410 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
25420 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
25430 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
25440 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
25450 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
25460 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
25470 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
25480 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
25490 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
254a0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62  y = -1;.    pTab
254b0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
254c0 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
254d0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
254e0 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20 70  048576) );.    p
254f0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
25500 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c 20   TF_Ephemeral | 
25510 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69  TF_NoVisibleRowi
25520 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53  d;.    pFrom->pS
25530 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
25540 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43 74  electDup(db, pCt
25550 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
25560 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
25570 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
25580 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
25590 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
255a0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
255b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
255c0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
255d0 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a  cursive CTE. */.
255e0 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d      pSel = pFrom
255f0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62  ->pSelect;.    b
25600 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20 28  MayRecursive = (
25610 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c   pSel->op==TK_AL
25620 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54  L || pSel->op==T
25630 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69  K_UNION );.    i
25640 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
25650 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
25660 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a  .      SrcList *
25670 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSrc = pFrom->pS
25680 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20  elect->pSrc;.   
25690 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
256a0 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
256b0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
256c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
256d0 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d  em = &pSrc->a[i]
256e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
256f0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
25700 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  0 .         && p
25710 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a  Item->zName!=0 .
25720 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
25730 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
25740 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65  tem->zName, pCte
25750 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20  ->zName).       
25760 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
25770 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pItem->pTab = pT
25780 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ab;.          pI
25790 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  tem->fg.isRecurs
257a0 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ive = 1;.       
257b0 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
257c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ++;.          pS
257d0 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  el->selFlags |= 
257e0 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20  SF_Recursive;.  
257f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25800 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e      }..    /* On
25810 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65  ly one recursive
25820 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65   reference is pe
25830 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20  rmitted. */ .   
25840 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52   if( pTab->nTabR
25850 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
25860 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
25870 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
25880 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
25890 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
258a0 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
258b0 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
258c0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
258d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
258e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
258f0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d   pTab->nTabRef==
25900 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c  1 || ((pSel->sel
25910 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69  Flags&SF_Recursi
25920 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61  ve) && pTab->nTa
25930 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  bRef==2 ));..   
25940 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
25950 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72   "circular refer
25960 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70  ence: %s";.    p
25970 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72  SavedWith = pPar
25980 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
25990 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
259a0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d  With;.    if( bM
259b0 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
259c0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72       Select *pPr
259d0 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  ior = pSel->pPri
259e0 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  or;.      assert
259f0 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d  ( pPrior->pWith=
25a00 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  =0 );.      pPri
25a10 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c  or->pWith = pSel
25a20 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73  ->pWith;.      s
25a30 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
25a40 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72  (pWalker, pPrior
25a50 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
25a60 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20  >pWith = 0;.    
25a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
25a80 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
25a90 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
25aa0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
25ab0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
25ac0 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
25ad0 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
25ae0 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
25af0 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
25b00 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
25b10 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
25b20 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
25b30 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
25b40 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
25b50 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
25b60 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
25b70 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25b80 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
25b90 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
25ba0 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
25bb0 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
25bc0 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
25bd0 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
25be0 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
25bf0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
25c00 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
25c10 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
25c20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
25c30 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
25c40 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
25c50 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
25c60 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
25c70 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
25c80 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
25c90 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
25ca0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
25cb0 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
25cc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
25cd0 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
25ce0 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
25cf0 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74         pCte->zCt
25d00 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  eErr = "multiple
25d10 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
25d20 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
25d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25d40 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
25d50 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
25d60 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
25d70 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
25d80 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
25d90 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
25da0 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
25db0 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
25dc0 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  r = 0;.    pPars
25dd0 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
25de0 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65  dWith;.  }..  re
25df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25e00 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
25e10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
25e20 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  E./*.** If the S
25e30 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20  ELECT passed as 
25e40 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
25e50 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63  ent has an assoc
25e60 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63  iated WITH .** c
25e70 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72  lause, pop it fr
25e80 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f  om the stack sto
25e90 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
25ea0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
25eb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
25ec0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
25ed0 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  the xSelectCallb
25ee0 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20  ack2() callback 
25ef0 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  by.** sqlite3Sel
25f00 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e  ectExpand() when
25f10 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43   walking a SELEC
25f20 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76  T tree to resolv
25f30 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
25f40 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20   and other FROM 
25f50 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e  clause elements.
25f60 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
25f70 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57   selectPopWith(W
25f80 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
25f90 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
25fa0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
25fb0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
25fc0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 57 69   if( pParse->pWi
25fd0 74 68 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d  th && p->pPrior=
25fe0 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
25ff0 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67 68  pWith = findRigh
26000 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 3b  tmost(p)->pWith;
26010 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21 3d  .    if( pWith!=
26020 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
26030 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68  t( pParse->pWith
26040 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20 20  ==pWith );.     
26050 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
26060 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b 0a   pWith->pOuter;.
26070 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
26080 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74  e.#define select
26090 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69 66  PopWith 0.#endif
260a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
260b0 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72  tine is a Walker
260c0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65   callback for "e
260d0 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45  xpanding" a SELE
260e0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
260f0 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61   "Expanding" mea
26100 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c  ns to do the fol
26110 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
26120 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20   (1)  Make sure 
26130 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
26140 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
26150 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a  signed to every.
26160 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65  **         eleme
26170 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  nt of the FROM c
26180 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lause..**.**    
26190 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65  (2)  Fill in the
261a0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70   pTabList->a[].p
261b0 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68  Tab fields in th
261c0 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a  e SrcList that .
261d0 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e  **         defin
261e0 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  es FROM clause. 
261f0 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65   When views appe
26200 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
26210 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20  lause,.**       
26220 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d    fill pTabList-
26230 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74  >a[].pSelect wit
26240 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
26250 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
26260 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74  .**         that
26270 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
26280 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73  view.  A copy is
26290 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65   made of the vie
262a0 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20  w's SELECT.**   
262b0 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20        statement 
262c0 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66  so that we can f
262d0 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20  reely modify or 
262e0 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74  delete that stat
262f0 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
26300 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e   without worryin
26310 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20  g about messing 
26320 75 70 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  up the persisten
26330 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
26340 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74  .**         of t
26350 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20  he view..**.**  
26360 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73    (3)  Add terms
26370 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
26380 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ause to accommod
26390 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
263a0 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
263b0 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
263c0 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
263d0 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
263e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
263f0 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
26400 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
26410 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
26420 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
26430 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
26440 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
26450 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
26460 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
26470 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
26480 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
26490 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
264a0 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
264b0 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
264c0 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
264d0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
264e0 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
264f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
26500 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
26510 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
26520 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
26530 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
26540 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
26550 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
26560 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
26570 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
26580 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
26590 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
265a0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
265b0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
265c0 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
265d0 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
265e0 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
265f0 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e  selFlags;..  p->
26600 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
26610 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
26620 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
26640 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
26650 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72  if( NEVER(p->pSr
26660 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61  c==0) || (selFla
26670 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
26680 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
26690 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
266a0 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
266b0 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
266c0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
266d0 69 66 28 20 70 2d 3e 70 57 69 74 68 20 29 7b 0a  if( p->pWith ){.
266e0 20 20 20 20 73 71 6c 69 74 65 33 57 69 74 68 50      sqlite3WithP
266f0 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ush(pParse, p->p
26700 57 69 74 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  With, 0);.  }.. 
26710 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
26720 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
26730 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
26740 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
26750 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
26760 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
26770 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
26780 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
26790 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
267a0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
267b0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
267c0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
267d0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
267e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
267f0 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
26800 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
26810 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
26820 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
26830 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
26840 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
26850 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
26860 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
26870 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
26880 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
26890 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
268a0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
268b0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
268c0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
268d0 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
268e0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
268f0 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
26900 73 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d  sive==0 || pFrom
26910 2d 3e 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ->pTab!=0 );.   
26920 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69   if( pFrom->fg.i
26930 73 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e  sRecursive ) con
26940 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
26950 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
26960 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
26970 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
26980 20 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28   if( withExpand(
26990 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20  pWalker, pFrom) 
269a0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
269b0 72 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f  rt;.    if( pFro
269c0 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73  m->pTab ) {} els
269d0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
269e0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
269f0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
26a00 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
26a10 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
26a20 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
26a30 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
26a40 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
26a50 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
26a60 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
26a70 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
26a80 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
26a90 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
26aa0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
26ab0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
26ac0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
26ad0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
26ae0 6f 72 74 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d  ort;.      pFrom
26af0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
26b00 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
26b10 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
26b20 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69 66  able));.      if
26b30 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
26b40 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26b50 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
26b60 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61  f = 1;.      pTa
26b70 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
26b80 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
26b90 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76  qlite_sq_%p", (v
26ba0 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20  oid*)pTab);.    
26bb0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
26bc0 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
26bd0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
26be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c        sqlite3Col
26bf0 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
26c00 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
26c10 45 4c 69 73 74 2c 26 70 54 61 62 2d 3e 6e 43 6f  EList,&pTab->nCo
26c20 6c 2c 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  l,&pTab->aCol);.
26c30 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
26c40 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
26c50 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
26c60 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
26c70 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
26c80 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20  (1048576) );.   
26c90 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
26ca0 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
26cb0 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
26cc0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
26cd0 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
26ce0 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
26cf0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26d00 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
26d10 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
26d20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
26d30 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
26d40 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
26d50 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
26d60 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66  pFrom);.      if
26d70 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
26d80 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26d90 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54      if( pTab->nT
26da0 61 62 52 65 66 3e 3d 30 78 66 66 66 66 20 29 7b  abRef>=0xffff ){
26db0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26dc0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
26dd0 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72   "too many refer
26de0 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a  ences to \"%s\":
26df0 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20   max 65535",.   
26e00 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
26e10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46  ame);.        pF
26e20 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  rom->pTab = 0;. 
26e30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
26e40 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
26e50 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61  .      pTab->nTa
26e60 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66  bRef++;.      if
26e70 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  ( !IsVirtual(pTa
26e80 62 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46 75  b) && cannotBeFu
26e90 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
26ea0 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  From) ){.       
26eb0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26ec0 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  t;.      }.#if !
26ed0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
26ee0 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
26ef0 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
26f00 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
26f10 0a 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72  .      if( IsVir
26f20 74 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70 54  tual(pTab) || pT
26f30 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
26f40 20 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b         i16 nCol;
26f50 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
26f60 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
26f70 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
26f80 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
26f90 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20  C_Abort;.       
26fa0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
26fb0 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
26fc0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65        pFrom->pSe
26fd0 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
26fe0 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
26ff0 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  ->pSelect, 0);. 
27000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
27010 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72 6f  lectSetName(pFro
27020 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61 62  m->pSelect, pTab
27030 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
27040 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    nCol = pTab->n
27050 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61  Col;.        pTa
27060 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  b->nCol = -1;.  
27070 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
27080 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
27090 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29   pFrom->pSelect)
270a0 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ;.        pTab->
270b0 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20  nCol = nCol;.   
270c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
270d0 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65  }..    /* Locate
270e0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64   the index named
270f0 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20   by the INDEXED 
27100 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e  BY clause, if an
27110 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  y. */.    if( sq
27120 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f  lite3IndexedByLo
27130 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72  okup(pParse, pFr
27140 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  om) ){.      ret
27150 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
27160 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
27170 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b  rocess NATURAL k
27180 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20  eywords, and ON 
27190 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
271a0 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f  s of joins..  */
271b0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
271c0 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74  cFailed || sqlit
271d0 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61  eProcessJoin(pPa
271e0 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72  rse, p) ){.    r
271f0 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
27200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  .  }..  /* For e
27210 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63  very "*" that oc
27220 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  curs in the colu
27230 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20  mn list, insert 
27240 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a  the names of.  *
27250 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  * all columns in
27260 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e   all tables.  An
27270 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c  d for every TABL
27280 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e  E.* insert the n
27290 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c  ames.  ** of all
272a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c   columns in TABL
272b0 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  E.  The parser i
272c0 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61  nserted a specia
272d0 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  l expression.  *
272e0 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53  * with the TK_AS
272f0 54 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20  TERISK operator 
27300 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61  for each "*" tha
27310 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68  t it found in th
27320 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69  e column.  ** li
27330 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  st.  The followi
27340 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73  ng code just has
27350 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54   to locate the T
27360 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20  K_ASTERISK.  ** 
27370 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20  expressions and 
27380 65 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20  expand each one 
27390 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
273a0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20  ll columns in.  
273b0 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20  ** all tables.. 
273c0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72   **.  ** The fir
273d0 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65  st loop just che
273e0 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68  cks to see if th
273f0 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20  ere are any "*" 
27400 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74  operators.  ** t
27410 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69  hat need expandi
27420 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b  ng..  */.  for(k
27430 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; k<pEList->nE
27440 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70  xpr; k++){.    p
27450 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d  E = pEList->a[k]
27460 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
27470 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52  pE->op==TK_ASTER
27480 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ISK ) break;.   
27490 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
274a0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70  =TK_DOT || pE->p
274b0 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
274c0 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
274d0 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70  TK_DOT || (pE->p
274e0 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70  Left!=0 && pE->p
274f0 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29  Left->op==TK_ID)
27500 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e   );.    if( pE->
27510 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
27520 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ->pRight->op==TK
27530 5f 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61  _ASTERISK ) brea
27540 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70  k;.  }.  if( k<p
27550 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
27560 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
27570 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
27580 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
27590 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
275a0 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
275b0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
275c0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
275d0 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
275e0 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
275f0 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
27600 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
27610 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
27620 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
27630 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
27640 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
27650 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
27660 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
27670 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
27680 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
27690 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
276a0 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
276b0 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
276c0 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20  olNames)!=0.    
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276e0 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51    && (flags & SQ
276f0 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
27700 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72  es)==0;..    for
27710 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
27720 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
27730 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
27740 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  pr;.      pRight
27750 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
27760 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
27770 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
27780 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
27790 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
277a0 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20  _ASTERISK.      
277b0 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
277c0 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
277d0 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a  p!=TK_ASTERISK).
277e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
277f0 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
27800 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
27810 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
27820 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
27830 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27840 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
27850 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
27860 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
27870 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
27880 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
27890 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
278a0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
278b0 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
278c0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
278d0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
278e0 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
278f0 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
27900 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
27910 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
27920 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
27930 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
27940 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
27950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27960 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
27970 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
27980 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
27990 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
279a0 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
279b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
279c0 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
279d0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
279e0 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
279f0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
27a00 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
27a10 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
27a20 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
27a30 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
27a40 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
27a50 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27a60 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
27a70 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
27a80 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
27a90 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
27aa0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
27ab0 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
27ac0 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
27ad0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
27ae0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
27af0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
27b00 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
27b10 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
27b20 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
27b30 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
27b40 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
27b50 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
27b60 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
27b70 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
27b80 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
27b90 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
27ba0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
27bb0 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
27bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27bd0 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
27be0 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
27bf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27c00 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
27c10 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
27c20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27c30 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
27c40 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
27c50 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
27c60 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
27c70 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
27c80 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
27c90 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
27ca0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
27cb0 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
27cc0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
27cd0 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
27ce0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27cf0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
27d00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27d10 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
27d20 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
27d30 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
27d40 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
27d50 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
27d60 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
27d70 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  [iDb].zDbSName :
27d80 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
27d90 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
27da0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
27db0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
27dc0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
27dd0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
27de0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
27df0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
27e00 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
27e10 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
27e20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
27e30 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
27e40 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
27e50 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
27e60 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
27e70 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
27e80 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
27e90 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
27ea0 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
27eb0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
27ec0 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
27ed0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
27ee0 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
27ef0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
27f00 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
27f10 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
27f20 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
27f30 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
27f40 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
27f50 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
27f60 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
27f70 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
27f80 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
27f90 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
27fa0 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72  den', omit it fr
27fb0 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  om the expanded.
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
27fd0 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75  esult-set list u
27fe0 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54  nless the SELECT
27ff0 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c   has the SF_Incl
28000 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20  udeHidden.      
28010 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74        ** bit set
28020 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
28030 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28040 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
28050 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
28060 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
28070 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c    && IsHiddenCol
28080 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
28090 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  j]) .           
280a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
280b0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
280c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
280d0 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
280e0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
280f0 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
28100 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
28110 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
28120 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om->fg.jointype 
28130 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
28140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28150 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
28160 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
28170 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
28180 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
28190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
281a0 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
281b0 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
281c0 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
281d0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
281e0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
281f0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
28200 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
28210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
28220 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
28230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28240 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
28250 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
28260 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
28270 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
28280 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
28290 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
282a0 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
282b0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
282d0 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
282e0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
282f0 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
28310 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
28320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28340 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
28350 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
28360 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
28370 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
28380 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
28390 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
283a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
283b0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
283c0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
283d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
283e0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
283f0 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
28400 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
28410 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
28420 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
28430 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
28440 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
28450 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
28460 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
28470 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
28480 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
28490 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
284a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
284b0 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
284c0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
284d0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
284e0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
284f0 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
28500 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  t, pExpr);.     
28510 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28520 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
28530 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
28540 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
28550 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
28560 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
28570 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
28580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
28590 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
285a0 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
285b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
285c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
285d0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
285e0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
285f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28600 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
28610 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
28620 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
28630 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
28640 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
28650 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f  t(&sColname, zCo
28660 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
28670 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
28680 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
28690 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61  e, pNew, &sColna
286a0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
286b0 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
286c0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
286d0 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
286e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
286f0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
28700 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e  t_item *pX = &pN
28710 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
28720 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1];.          
28730 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a      if( pSub ){.
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
28760 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
28770 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
28780 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  j].zSpan);.     
28790 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
287a0 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
287b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
287c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
287d0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
287e0 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  pan = sqlite3MPr
287f0 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e  intf(db, "%s.%s.
28800 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61  zSchemaName, zTa
28840 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  bName, zColname)
28850 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28860 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
28870 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
28880 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28890 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53            pX->bS
288a0 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20  panIsTab = 1;.  
288b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
288c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
288d0 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65  bFree(db, zToFre
288e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
288f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28900 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
28910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
28920 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
28930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28940 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
28950 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
28960 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
28970 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28980 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28990 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
289a0 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
289b0 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
289c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
289d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
289e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
289f0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
28a00 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
28a10 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
28a20 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
28a30 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70  OLUMN.  if( p->p
28a40 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69  EList && p->pELi
28a50 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  st->nExpr>db->aL
28a60 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
28a70 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
28a80 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
28a90 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
28aa0 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65  ny columns in re
28ab0 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20  sult set");.    
28ac0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
28ad0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
28ae0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
28af0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
28b00 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
28b10 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
28b20 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
28b30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
28b40 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
28b50 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
28b60 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
28b70 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
28b80 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
28b90 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
28ba0 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
28bb0 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
28bc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
28bd0 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
28be0 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
28bf0 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
28c00 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
28c10 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
28c20 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
28c30 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
28c40 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
28c50 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r tree..*/.int s
28c60 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
28c70 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
28c80 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
28c90 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
28ca0 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
28cb0 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
28cc0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
28cd0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  ue;.}../*.** No-
28ce0 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
28cf0 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
28d00 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45 43 54 20  lker for SELECT 
28d10 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73  statements..** s
28d20 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
28d30 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69  arser tree..*/.i
28d40 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
28d50 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
28d60 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74  *NotUsed, Select
28d70 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
28d80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
28d90 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
28da0 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
28db0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23  C_Continue;.}..#
28dc0 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
28dd0 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73 73  /*.** Always ass
28de0 65 72 74 2e 20 20 54 68 69 73 20 78 53 65 6c 65  ert.  This xSele
28df0 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c  ctCallback2 impl
28e00 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65  ementation prove
28e10 73 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 78 53  s that the.** xS
28e20 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69  electCallback2 i
28e30 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e  s never invoked.
28e40 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28e50 53 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74  SelectWalkAssert
28e60 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  2(Walker *NotUse
28e70 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  d, Select *NotUs
28e80 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
28e90 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
28ea0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
28eb0 61 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23  assert( 0 );.}.#
28ec0 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73  endif./*.** This
28ed0 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64   routine "expand
28ee0 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  s" a SELECT stat
28ef0 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66  ement and all of
28f00 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e   its subqueries.
28f10 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e  .** For addition
28f20 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
28f30 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20  n what it means 
28f40 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45  to "expand" a SE
28f50 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  LECT.** statemen
28f60 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65  t, see the comme
28f70 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74  nt on the select
28f80 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61  Expand worker ca
28f90 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a  llback above..**
28fa0 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20  .** Expanding a 
28fb0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28fc0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74   is the first st
28fd0 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  ep in processing
28fe0 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
28ff0 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c  tement.  The SEL
29000 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75  ECT statement mu
29010 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62  st be expanded b
29020 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65  efore.** name re
29030 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66  solution is perf
29040 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormed..**.** If 
29050 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
29060 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65  ong, an error me
29070 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e  ssage is written
29080 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a   into pParse..**
29090 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
290a0 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74  ction can detect
290b0 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20   the problem by 
290c0 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73  looking at pPars
290d0 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f  e->nErr.** and/o
290e0 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  r pParse->db->ma
290f0 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73  llocFailed..*/.s
29100 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
29110 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50  e3SelectExpand(P
29120 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
29130 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
29140 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
29150 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
29160 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e  sqlite3ExprWalkN
29170 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  oop;.  w.pParse 
29180 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  = pParse;.  if( 
29190 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
291a0 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53 65  und ){.    w.xSe
291b0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63  lectCallback = c
291c0 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
291d0 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b 0a  lectToSubquery;.
291e0 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c      w.xSelectCal
291f0 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20  lback2 = 0;.    
29200 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
29210 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
29220 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
29230 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
29240 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
29250 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
29260 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
29270 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
29280 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
29290 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
292a0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
292b0 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
292c0 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
292d0 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
292e0 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
292f0 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
29300 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
29310 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
29320 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
29330 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
29340 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
29350 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
29360 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
29370 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
29380 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
29390 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
293a0 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
293b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
293c0 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
293d0 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
293e0 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
293f0 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
29400 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
29410 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
29420 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
29430 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
29440 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
29450 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
29460 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
29470 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
29480 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
29490 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
294a0 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
294b0 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
294c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
294d0 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
294e0 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
294f0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
29500 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
29510 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
29520 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
29530 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
29540 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
29550 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
29560 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
29570 6c 76 65 64 20 29 3b 0a 20 20 61 73 73 65 72 74  lved );.  assert
29580 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
29590 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29   SF_HasTypeInfo)
295a0 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
295b0 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79  lags |= SF_HasTy
295c0 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72 73 65  peInfo;.  pParse
295d0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
295e0 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  se;.  pTabList =
295f0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f 72 28   p->pSrc;.  for(
29600 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
29610 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
29620 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
29630 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
29640 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
29650 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
29660 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
29670 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74 61     if( (pTab->ta
29680 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
29690 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  meral)!=0 ){.   
296a0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
296b0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
296c0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
296d0 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74   */.      Select
296e0 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
296f0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 69  pSelect;.      i
29700 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20  f( pSel ){.     
29710 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
29720 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
29730 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
29740 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
29750 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
29760 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
29770 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29  rse, pTab, pSel)
29780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29790 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
297a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
297b0 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65 20  e adds datatype 
297c0 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  and collating se
297d0 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  quence informati
297e0 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61 62  on to.** the Tab
297f0 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  le structures of
29800 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
29810 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 61   subqueries in a
29820 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
29830 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  ment..**.** Use 
29840 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66 74  this routine aft
29850 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
29860 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
29870 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
29880 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72 73  AddTypeInfo(Pars
29890 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
298a0 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69 66  t *pSelect){.#if
298b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
298c0 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c 6b  _SUBQUERY.  Walk
298d0 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  er w;.  w.xSelec
298e0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69  tCallback = sqli
298f0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f  te3SelectWalkNoo
29900 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
29910 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
29920 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
29930 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
29940 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33  llback = sqlite3
29950 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  ExprWalkNoop;.  
29960 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
29970 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
29980 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
29990 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a  ct);.#endif.}...
299a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
299b0 6e 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c  ne sets up a SEL
299c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  ECT statement fo
299d0 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54  r processing.  T
299e0 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
299f0 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a  is accomplished:
29a00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44  .**.**     *  VD
29a10 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE Cursor number
29a20 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74  s are assigned t
29a30 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  o all FROM-claus
29a40 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20  e terms..**     
29a50 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62  *  Ephemeral Tab
29a60 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  le objects are c
29a70 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46  reated for all F
29a80 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
29a90 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  eries..**     * 
29aa0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
29ab0 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65  auses are shifte
29ac0 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61  d into WHERE sta
29ad0 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a  tements.**     *
29ae0 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20    Wildcards "*" 
29af0 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e  and "TABLE.*" in
29b00 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65   result sets are
29b10 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20   expanded..**   
29b20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73    *  Identifiers
29b30 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61   in expression a
29b40 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61  re matched to ta
29b50 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  bles..**.** This
29b60 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65   routine acts re
29b70 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c  cursively on all
29b80 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
29b90 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a  in the SELECT..*
29ba0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
29bb0 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73  lectPrep(.  Pars
29bc0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
29bd0 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
29be0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
29bf0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
29c00 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
29c10 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
29c20 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
29c30 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
29c40 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
29c50 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69  ntext for contai
29c60 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ner */.){.  sqli
29c70 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e  te3 *db;.  if( N
29c80 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
29c90 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  urn;.  db = pPar
29ca0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
29cb0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29cc0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
29cd0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
29ce0 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65  HasTypeInfo ) re
29cf0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
29d00 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72  electExpand(pPar
29d10 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50  se, p);.  if( pP
29d20 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
29d30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
29d40 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
29d50 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
29d60 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ames(pParse, p, 
29d70 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28  pOuterNC);.  if(
29d80 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
29d90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
29da0 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  d ) return;.  sq
29db0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
29dc0 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  peInfo(pParse, p
29dd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65  );.}../*.** Rese
29de0 74 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  t the aggregate 
29df0 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a  accumulator..**.
29e00 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65  ** The aggregate
29e10 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20   accumulator is 
29e20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20  a set of memory 
29e30 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a  cells that hold.
29e40 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
29e50 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61  results while ca
29e60 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67  lculating an agg
29e70 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a  regate.  This.**
29e80 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
29e90 65 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f  es code that sto
29ea0 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c  res NULLs in all
29eb0 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79   of those memory
29ec0 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74  .** cells..*/.st
29ed0 61 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41  atic void resetA
29ee0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
29ef0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
29f00 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
29f10 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
29f20 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
29f30 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
29f40 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a  fo_func *pFunc;.
29f50 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67    int nReg = pAg
29f60 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70  gInfo->nFunc + p
29f70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
29f80 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20  ;.  if( nReg==0 
29f90 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66  ) return;.#ifdef
29fa0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
29fb0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61  /* Verify that a
29fc0 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73  ll AggInfo regis
29fd0 74 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20  ters are within 
29fe0 74 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66  the range specif
29ff0 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49  ied by.  ** AggI
2a000 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e  nfo.mnReg..AggIn
2a010 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73  fo.mxReg */.  as
2a020 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67  sert( nReg==pAgg
2a030 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67  Info->mxReg-pAgg
2a040 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b  Info->mnReg+1 );
2a050 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
2a060 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
2a070 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
2a080 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  t( pAggInfo->aCo
2a090 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  l[i].iMem>=pAggI
2a0a0 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
2a0b0 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
2a0c0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  >aCol[i].iMem<=p
2a0d0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
2a0e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
2a0f0 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
2a100 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  nc; i++){.    as
2a110 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
2a120 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  aFunc[i].iMem>=p
2a130 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
2a140 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
2a150 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
2a160 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
2a170 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Reg );.  }.#endi
2a180 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  f.  sqlite3VdbeA
2a190 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp3(v, OP_Null
2a1a0 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  , 0, pAggInfo->m
2a1b0 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e  nReg, pAggInfo->
2a1c0 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46  mxReg);.  for(pF
2a1d0 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46  unc=pAggInfo->aF
2a1e0 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67  unc, i=0; i<pAgg
2a1f0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2a200 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20  , pFunc++){.    
2a210 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  if( pFunc->iDist
2a220 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
2a230 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e   Expr *pE = pFun
2a240 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  c->pExpr;.      
2a250 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2a260 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
2a270 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2a280 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c      if( pE->x.pL
2a290 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e  ist==0 || pE->x.
2a2a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  pList->nExpr!=1 
2a2b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2a2c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2a2d0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67  e, "DISTINCT agg
2a2e0 72 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76  regates must hav
2a2f0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a  e exactly one ".
2a300 20 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75             "argu
2a310 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  ment");.        
2a320 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2a330 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
2a340 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49  se{.        KeyI
2a350 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
2a360 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
2a370 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e  ist(pParse, pE->
2a380 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29 3b 0a  x.pList, 0, 0);.
2a390 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2a3a0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
2a3b0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
2a3c0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
2a3d0 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3f0 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
2a400 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2a410 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2a420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
2a430 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c   the OP_AggFinal
2a440 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65  ize opcode for e
2a450 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66  very aggregate f
2a460 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  unction.** in th
2a470 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
2a480 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
2a490 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46  oid finalizeAggF
2a4a0 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a  unctions(Parse *
2a4b0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
2a4c0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
2a4d0 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2a4e0 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2a4f0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2a500 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72  _func *pF;.  for
2a510 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
2a520 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
2a530 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2a540 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70  , pF++){.    Exp
2a550 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2a560 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
2a570 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
2a580 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2a590 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
2a5a0 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2a5b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a5c0 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c  2(v, OP_AggFinal
2a5d0 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73  , pF->iMem, pLis
2a5e0 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
2a5f0 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74   : 0);.    sqlit
2a600 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
2a610 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  , pF->pFunc, P4_
2a620 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
2a630 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
2a640 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
2a650 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
2a660 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
2a670 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
2a680 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
2a690 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2a6a0 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
2a6b0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
2a6c0 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
2a6d0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
2a6e0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2a6f0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
2a700 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
2a710 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
2a720 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
2a730 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
2a740 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2a750 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
2a760 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2a770 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
2a780 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
2a790 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
2a7a0 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
2a7b0 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
2a7c0 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
2a7d0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
2a7e0 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
2a7f0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2a800 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2a810 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2a820 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2a830 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2a840 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2a850 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2a860 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
2a870 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
2a880 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
2a890 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2a8a0 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
2a8b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2a8c0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2a8d0 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
2a8e0 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44  0, SQLITE_ECEL_D
2a8f0 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UP);.    }else{.
2a900 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
2a910 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
2a920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a930 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
2a940 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
2a950 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
2a960 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
2a970 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41      testcase( nA
2a980 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72  rg==0 );  /* Err
2a990 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a  or condition */.
2a9a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a9b0 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41  nArg>1 );   /* A
2a9c0 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  lso an error */.
2a9d0 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
2a9e0 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
2a9f0 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
2aa00 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
2aa10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
2aa20 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
2aa30 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
2aa40 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
2aa50 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
2aa60 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
2aa70 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2aa80 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
2aa90 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
2aaa0 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
2aab0 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
2aac0 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
2aad0 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
2aae0 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
2aaf0 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
2ab00 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
2ab10 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2ab20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
2ab30 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
2ab40 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
2ab50 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
2ab60 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
2ab70 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
2ab80 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
2ab90 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
2aba0 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
2abb0 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
2abc0 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
2abd0 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
2abe0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
2abf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2ac00 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
2ac10 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
2ac20 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
2ac30 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
2ac40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ac50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp3(v, OP_AggS
2ac60 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c  tep0, 0, regAgg,
2ac70 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20   pF->iMem);.    
2ac80 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
2ac90 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
2aca0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
2acb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2acc0 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
2acd0 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
2ace0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
2acf0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
2ad00 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
2ad10 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2ad20 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2ad30 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
2ad40 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
2ad50 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
2ad60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2ad70 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
2ad80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2ad90 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2ada0 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  arse);.    }.  }
2adb0 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f  ..  /* Before po
2adc0 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63  pulating the acc
2add0 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
2ade0 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f  rs, clear the co
2adf0 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a  lumn cache..  **
2ae00 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
2ae10 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72  ny of the requir
2ae20 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ed column values
2ae30 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65   are already pre
2ae40 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65  sent .  ** in re
2ae50 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33  gisters, sqlite3
2ae60 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75  ExprCode() may u
2ae70 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63  se OP_SCopy to c
2ae80 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20  opy the value.  
2ae90 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20  ** to pC->iMem. 
2aea0 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20  But by the time 
2aeb0 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65  the value is use
2aec0 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  d, the original 
2aed0 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61  register.  ** ma
2aee0 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64  y have been used
2aef0 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74  , invalidating t
2af00 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75  he underlying bu
2af10 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ffer holding the
2af20 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c  .  ** text or bl
2af30 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69  ob value. See ti
2af40 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35  cket [883034dcb5
2af50 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f  ]..  **.  ** Ano
2af60 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f  ther solution wo
2af70 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65  uld be to change
2af80 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73   the OP_SCopy us
2af90 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65  ed to copy cache
2afa0 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f  d.  ** values to
2afb0 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a   an OP_Copy..  *
2afc0 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29  /.  if( regHit )
2afd0 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73  {.    addrHitTes
2afe0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
2aff0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
2b000 72 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76  regHit); VdbeCov
2b010 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20  erage(v);.  }.  
2b020 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2b030 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2b040 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67   for(i=0, pC=pAg
2b050 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70  gInfo->aCol; i<p
2b060 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75  AggInfo->nAccumu
2b070 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b  lator; i++, pC++
2b080 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2b090 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
2b0a0 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d  C->pExpr, pC->iM
2b0b0 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49  em);.  }.  pAggI
2b0c0 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20  nfo->directMode 
2b0d0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
2b0e0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2b0f0 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72  rse);.  if( addr
2b100 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73  HitTest ){.    s
2b110 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2b120 72 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73  re(v, addrHitTes
2b130 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t);.  }.}../*.**
2b140 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50   Add a single OP
2b150 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
2b160 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45  tion to the VDBE
2b170 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69   to explain a si
2b180 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29  mple.** count(*)
2b190 20 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20   query ("SELECT 
2b1a0 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54  count(*) FROM pT
2b1b0 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ab")..*/.#ifndef
2b1c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2b1d0 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64  LAIN.static void
2b1e0 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
2b1f0 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  unt(.  Parse *pP
2b200 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
2b210 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
2b220 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62  context */.  Tab
2b230 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
2b240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b250 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72  Table being quer
2b260 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ied */.  Index *
2b270 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20  pIdx            
2b280 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2b290 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69  x used to optimi
2b2a0 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c  ze scan, or NULL
2b2b0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61   */.){.  if( pPa
2b2c0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
2b2d0 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65  ){.    int bCove
2b2e0 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20  r = (pIdx!=0 && 
2b2f0 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  (HasRowid(pTab) 
2b300 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  || !IsPrimaryKey
2b310 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20  Index(pIdx)));. 
2b320 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20     char *zEqp = 
2b330 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
2b340 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e  Parse->db, "SCAN
2b350 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a   TABLE %s%s%s",.
2b360 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
2b370 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 62 43 6f  ame,.        bCo
2b380 76 65 72 20 3f 20 22 20 55 53 49 4e 47 20 43 4f  ver ? " USING CO
2b390 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a  VERING INDEX " :
2b3a0 20 22 22 2c 0a 20 20 20 20 20 20 20 20 62 43 6f   "",.        bCo
2b3b0 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d  ver ? pIdx->zNam
2b3c0 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20  e : "".    );.  
2b3d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b3e0 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61  Op4(.        pPa
2b3f0 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45  rse->pVdbe, OP_E
2b400 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
2b410 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
2b420 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49   zEqp, P4_DYNAMI
2b430 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23  C.    );.  }.}.#
2b440 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
2b450 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2b460 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
2b470 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62  /*.** Context ob
2b480 6a 65 63 74 20 66 6f 72 20 68 61 76 69 6e 67 54  ject for havingT
2b490 6f 57 68 65 72 65 45 78 70 72 43 62 28 29 2e 0a  oWhereExprCb()..
2b4a0 2a 2f 0a 73 74 72 75 63 74 20 48 61 76 69 6e 67  */.struct Having
2b4b0 54 6f 57 68 65 72 65 43 74 78 20 7b 0a 20 20 45  ToWhereCtx {.  E
2b4c0 78 70 72 20 2a 2a 70 70 57 68 65 72 65 3b 0a 20  xpr **ppWhere;. 
2b4d0 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
2b4e0 70 42 79 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 73  pBy;.};../*.** s
2b4f0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
2b500 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62   callback used b
2b510 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28  y havingToWhere(
2b520 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
2b530 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20 74  node passed to t
2b540 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61  he callback is a
2b550 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65   TK_AND node, re
2b560 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e  turn .** WRC_Con
2b570 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73 71  tinue to tell sq
2b580 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20  lite3WalkExpr() 
2b590 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2b5a0 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a  gh child nodes..
2b5b0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
2b5c0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
2b5d0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
2b5e0 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20 74   also check if t
2b5f0 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65  he .** sub-expre
2b600 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68  ssion matches th
2b610 65 20 63 72 69 74 65 72 69 61 20 66 6f 72 20 62  e criteria for b
2b620 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68  eing moved to th
2b630 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73  e WHERE.** claus
2b640 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74  e. If so, add it
2b650 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
2b660 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63 65  ause and replace
2b670 20 74 68 65 20 73 75 62 2d 65 78 70 72 65 73 73   the sub-express
2b680 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ion.** within th
2b690 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73  e HAVING express
2b6a0 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73 74  ion with a const
2b6b0 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74  ant "1"..*/.stat
2b6c0 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f 57  ic int havingToW
2b6d0 68 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b 65  hereExprCb(Walke
2b6e0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
2b6f0 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
2b700 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e  pExpr->op!=TK_AN
2b710 44 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  D ){.    struct 
2b720 48 61 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78  HavingToWhereCtx
2b730 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75   *p = pWalker->u
2b740 2e 70 48 61 76 69 6e 67 43 74 78 3b 0a 20 20 20  .pHavingCtx;.   
2b750 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
2b760 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75  IsConstantOrGrou
2b770 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61  pBy(pWalker->pPa
2b780 72 73 65 2c 20 70 45 78 70 72 2c 20 70 2d 3e 70  rse, pExpr, p->p
2b790 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20  GroupBy) ){.    
2b7a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2b7b0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d  pWalker->pParse-
2b7c0 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20  >db;.      Expr 
2b7d0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
2b7e0 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
2b7f0 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65  INTEGER, &sqlite
2b800 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30  3IntTokens[1], 0
2b810 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2b820 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  w ){.        Exp
2b830 72 20 2a 70 57 68 65 72 65 20 3d 20 2a 28 70 2d  r *pWhere = *(p-
2b840 3e 70 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20  >ppWhere);.     
2b850 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70     SWAP(Expr, *p
2b860 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20  New, *pExpr);.  
2b870 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2b880 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2b890 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
2b8a0 20 20 20 20 20 20 20 2a 28 70 2d 3e 70 70 57 68         *(p->ppWh
2b8b0 65 72 65 29 20 3d 20 70 4e 65 77 3b 0a 20 20 20  ere) = pNew;.   
2b8c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2b8d0 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
2b8e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2b8f0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2b900 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 6c  *.** Transfer el
2b910 69 67 69 62 6c 65 20 74 65 72 6d 73 20 66 72 6f  igible terms fro
2b920 6d 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  m the HAVING cla
2b930 75 73 65 20 6f 66 20 61 20 71 75 65 72 79 2c 20  use of a query, 
2b940 77 68 69 63 68 20 69 73 0a 2a 2a 20 70 72 6f 63  which is.** proc
2b950 65 73 73 65 64 20 61 66 74 65 72 20 67 72 6f 75  essed after grou
2b960 70 69 6e 67 2c 20 74 6f 20 74 68 65 20 57 48 45  ping, to the WHE
2b970 52 45 20 63 6c 61 75 73 65 2c 20 77 68 69 63 68  RE clause, which
2b980 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 62 65   is processed be
2b990 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70 69 6e 67  fore.** grouping
2b9a0 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  . For example, t
2b9b0 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
2b9c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2b9d0 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45 20 61  <tables> WHERE a
2b9e0 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41  =? GROUP BY b HA
2b9f0 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20 63 3d 3f  VING b=? AND c=?
2ba00 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 20 72 65  .**.** can be re
2ba10 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
2ba20 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
2ba30 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52 45  M <tables> WHERE
2ba40 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20 47 52 4f   a=? AND b=? GRO
2ba50 55 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 63  UP BY b HAVING c
2ba60 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65 72 6d 20  =?.**.** A term 
2ba70 6f 66 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  of the HAVING ex
2ba80 70 72 65 73 73 69 6f 6e 20 69 73 20 65 6c 69 67  pression is elig
2ba90 69 62 6c 65 20 66 6f 72 20 74 72 61 6e 73 66 65  ible for transfe
2baa0 72 20 69 66 20 69 74 20 63 6f 6e 73 69 73 74 73  r if it consists
2bab0 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  .** entirely of 
2bac0 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64 20 65 78  constants and ex
2bad0 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
2bae0 72 65 20 61 6c 73 6f 20 47 52 4f 55 50 20 42 59  re also GROUP BY
2baf0 20 74 65 72 6d 73 20 74 68 61 74 0a 2a 2a 20 75   terms that.** u
2bb00 73 65 20 74 68 65 20 22 42 49 4e 41 52 59 22 20  se the "BINARY" 
2bb10 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
2bb20 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
2bb30 69 64 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  id havingToWhere
2bb40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2bb50 65 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e,.  ExprList *p
2bb60 47 72 6f 75 70 42 79 2c 0a 20 20 45 78 70 72 20  GroupBy,.  Expr 
2bb70 2a 70 48 61 76 69 6e 67 2c 20 0a 20 20 45 78 70  *pHaving, .  Exp
2bb80 72 20 2a 2a 70 70 57 68 65 72 65 0a 29 7b 0a 20  r **ppWhere.){. 
2bb90 20 73 74 72 75 63 74 20 48 61 76 69 6e 67 54 6f   struct HavingTo
2bba0 57 68 65 72 65 43 74 78 20 73 43 74 78 3b 0a 20  WhereCtx sCtx;. 
2bbb0 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b   Walker sWalker;
2bbc0 0a 0a 20 20 73 43 74 78 2e 70 70 57 68 65 72 65  ..  sCtx.ppWhere
2bbd0 20 3d 20 70 70 57 68 65 72 65 3b 0a 20 20 73 43   = ppWhere;.  sC
2bbe0 74 78 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  tx.pGroupBy = pG
2bbf0 72 6f 75 70 42 79 3b 0a 0a 20 20 6d 65 6d 73 65  roupBy;..  memse
2bc00 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73  t(&sWalker, 0, s
2bc10 69 7a 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b  izeof(sWalker));
2bc20 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73  .  sWalker.pPars
2bc30 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57  e = pParse;.  sW
2bc40 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
2bc50 61 63 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68  ack = havingToWh
2bc60 65 72 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61  ereExprCb;.  sWa
2bc70 6c 6b 65 72 2e 75 2e 70 48 61 76 69 6e 67 43 74  lker.u.pHavingCt
2bc80 78 20 3d 20 26 73 43 74 78 3b 0a 20 20 73 71 6c  x = &sCtx;.  sql
2bc90 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57  ite3WalkExpr(&sW
2bca0 61 6c 6b 65 72 2c 20 70 48 61 76 69 6e 67 29 3b  alker, pHaving);
2bcb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
2bcc0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54  to see if the pT
2bcd0 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61  his entry of pTa
2bce0 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d  bList is a self-
2bcf0 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20  join of a prior 
2bd00 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69  view..** If it i
2bd10 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  s, then return t
2bd20 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  he SrcList_item 
2bd30 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69  for the prior vi
2bd40 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ew.  If it is no
2bd50 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  t,.** then retur
2bd60 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  n 0..*/.static s
2bd70 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2bd80 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69  em *isSelfJoinVi
2bd90 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ew(.  SrcList *p
2bda0 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
2bdb0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2bdc0 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74   self-joins in t
2bdd0 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  his FROM clause 
2bde0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
2bdf0 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20  ist_item *pThis 
2be00 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2be10 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20  prior reference 
2be20 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79  to this subquery
2be30 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2be40 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2be50 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  tem;.  for(pItem
2be60 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20   = pTabList->a; 
2be70 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74  pItem<pThis; pIt
2be80 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  em++){.    if( p
2be90 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  Item->pSelect==0
2bea0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2beb0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
2bec0 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f  iaCoroutine ) co
2bed0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2bee0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
2bef0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2bf00 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2bf10 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61  cmp(pItem->zData
2bf20 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61  base, pThis->zDa
2bf30 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e  tabase)!=0 ) con
2bf40 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
2bf50 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
2bf60 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68  Item->zName, pTh
2bf70 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20  is->zName)!=0 ) 
2bf80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2bf90 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2bfa0 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20  pare(0, .       
2bfb0 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63     pThis->pSelec
2bfc0 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  t->pWhere, pItem
2bfd0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
2bfe0 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20  e, -1) .    ){. 
2bff0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77       /* The view
2c000 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79   was modified by
2c010 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69   some other opti
2c020 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73  mization such as
2c030 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f  .      ** pushDo
2c040 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a  wnWhereTerms() *
2c050 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
2c060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2c070 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20  rn pItem;.  }.  
2c080 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
2c090 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54  def SQLITE_COUNT
2c0a0 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
2c0b0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  ION./*.** Attemp
2c0c0 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  t to transform a
2c0d0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
2c0e0 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  rm.**.**    SELE
2c0f0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2c100 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
2c110 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
2c120 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a  ECT y FROM t2).*
2c130 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a  *.** Into this:.
2c140 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
2c150 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
2c160 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43   FROM t1)+(SELEC
2c170 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2c180 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72  t2).**.** The tr
2c190 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c  ansformation onl
2c1a0 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f  y works if all o
2c1b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2c1c0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
2c1d0 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72    *  The subquer
2c1e0 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  y is a UNION ALL
2c1f0 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
2c200 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68  terms.**   *  Th
2c210 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20  ere is no WHERE 
2c220 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  or GROUP BY or H
2c230 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e  AVING clauses on
2c240 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
2c250 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65  **   *  The oute
2c260 72 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  r query is a sim
2c270 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a  ple count(*).**.
2c280 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2c290 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2c2a0 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e  on is undertaken
2c2b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c2c0 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d  countOfViewOptim
2c2d0 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  ization(Parse *p
2c2e0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
2c2f0 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
2c300 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78  b, *pPrior;.  Ex
2c310 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
2c320 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c  r *pCount;.  sql
2c330 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
2c340 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2c350 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20  F_Aggregate)==0 
2c360 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a  ) return 0;   /*
2c370 20 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72   This is an aggr
2c380 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20  egate query */. 
2c390 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   if( p->pEList->
2c3a0 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
2c3b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2c3c0 20 20 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73     /* Single res
2c3d0 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
2c3e0 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
2c3f0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
2c400 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
2c410 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
2c420 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2c430 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20     /* Result is 
2c440 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a  an aggregate */.
2c450 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
2c460 72 69 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  ricmp(pExpr->u.z
2c470 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29  Token,"count") )
2c480 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d   return 0;  /* M
2c490 75 73 74 20 62 65 20 63 6f 75 6e 74 28 29 20 2a  ust be count() *
2c4a0 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 78  /.  if( pExpr->x
2c4b0 2e 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74 75  .pList!=0 ) retu
2c4c0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c4d0 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65        /* Must be
2c4e0 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69   count(*) */.  i
2c4f0 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  f( p->pSrc->nSrc
2c500 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  !=1 ) return 0; 
2c510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c520 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e   /* One table in
2c530 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2c540 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e   */.  pSub = p->
2c550 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
2c560 63 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d  ct;.  if( pSub==
2c570 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c590 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46          /* The F
2c5a0 52 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72  ROM is a subquer
2c5b0 79 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  y */.  if( pSub-
2c5c0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
2c5d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2c5e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
2c5f0 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   be a compound s
2c600 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 64 6f 7b  ubquery */.  do{
2c610 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 6f  .    if( pSub->o
2c620 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75  p!=TK_ALL && pSu
2c630 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  b->pPrior ) retu
2c640 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62  rn 0;  /* Must b
2c650 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20  e UNION ALL */. 
2c660 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68     if( pSub->pWh
2c670 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ere ) return 0; 
2c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c690 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45       /* No WHERE
2c6a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69   clause */.    i
2c6b0 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
2c6c0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2c6d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c6e0 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67 72 65   /* Not an aggre
2c6f0 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53 75 62  gate */.    pSub
2c700 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b   = pSub->pPrior;
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c730 20 52 65 70 65 61 74 20 6f 76 65 72 20 63 6f 6d   Repeat over com
2c740 70 6f 75 6e 64 20 74 65 72 6d 73 20 2a 2f 0a 20  pound terms */. 
2c750 20 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b   }while( pSub );
2c760 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
2c770 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  ch this point, t
2c780 68 61 74 20 6d 65 61 6e 73 20 69 74 20 69 73 20  hat means it is 
2c790 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  OK to perform th
2c7a0 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
2c7b0 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72   */..  db = pPar
2c7c0 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75 6e 74  se->db;.  pCount
2c7d0 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45 78 70   = pExpr;.  pExp
2c7e0 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20 3d 20  r = 0;.  pSub = 
2c7f0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2c800 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53 72 63  elect;.  p->pSrc
2c810 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 20 3d  ->a[0].pSelect =
2c820 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63   0;.  sqlite3Src
2c830 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2c840 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e 70 53  ->pSrc);.  p->pS
2c850 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
2c860 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
2c870 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 2d 3e  >db, sizeof(*p->
2c880 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c 65 28  pSrc));.  while(
2c890 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45 78 70   pSub ){.    Exp
2c8a0 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 70 50  r *pTerm;.    pP
2c8b0 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70 50 72  rior = pSub->pPr
2c8c0 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70  ior;.    pSub->p
2c8d0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
2c8e0 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Sub->pNext = 0;.
2c8f0 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
2c900 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
2c910 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65  te;.    pSub->se
2c920 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f  lFlags &= ~SF_Co
2c930 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53 75 62  mpound;.    pSub
2c940 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
2c950 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2c960 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
2c970 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
2c980 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72 69 6f     pTerm = pPrio
2c990 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 44  r ? sqlite3ExprD
2c9a0 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c 20 30  up(db, pCount, 0
2c9b0 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20 20 20  ) : pCount;.    
2c9c0 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pSub->pEList = s
2c9d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
2c9e0 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
2c9f0 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72  pTerm);.    pTer
2ca00 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  m = sqlite3PExpr
2ca10 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
2ca20 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  CT, 0, 0);.    s
2ca30 71 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65  qlite3PExprAddSe
2ca40 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 65  lect(pParse, pTe
2ca50 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 69  rm, pSub);.    i
2ca60 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20  f( pExpr==0 ){. 
2ca70 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65       pExpr = pTe
2ca80 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rm;.    }else{. 
2ca90 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c       pExpr = sql
2caa0 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2cab0 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65 72 6d  , TK_PLUS, pTerm
2cac0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
2cad0 20 20 20 20 70 53 75 62 20 3d 20 70 50 72 69 6f      pSub = pPrio
2cae0 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45 4c 69  r;.  }.  p->pELi
2caf0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 20 3d  st->a[0].pExpr =
2cb00 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73 65 6c   pExpr;.  p->sel
2cb10 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41 67 67  Flags &= ~SF_Agg
2cb20 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53 45 4c  regate;..#if SEL
2cb30 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2cb40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2cb50 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2cb60 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2cb70 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2cb80 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f 75 6e  e,p,("After coun
2cb90 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69 6d 69  t-of-view optimi
2cba0 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20  zation:\n"));.  
2cbb0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2cbc0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2cbd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
2cbe0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2cbf0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 55 4e  f /* SQLITE_COUN
2cc00 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41  TOFVIEW_OPTIMIZA
2cc10 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  TION */../*.** G
2cc20 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
2cc30 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2cc40 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
2cc50 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
2cc60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
2cc70 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
2cc80 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2cc90 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
2cca0 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
2ccb0 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
2ccc0 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
2ccd0 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
2cce0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2ccf0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
2cd00 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
2cd10 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
2cd20 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
2cd30 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
2cd40 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
2cd50 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
2cd60 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
2cd70 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
2cd80 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
2cd90 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
2cda0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
2cdb0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
2cdc0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
2cdd0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
2cde0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2cdf0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
2ce00 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2ce10 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
2ce20 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
2ce30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2ce40 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
2ce50 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
2ce60 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
2ce70 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
2ce80 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
2ce90 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
2cea0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
2ceb0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
2cec0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2ced0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
2cee0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
2cef0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
2cf00 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
2cf10 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
2cf20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
2cf30 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2cf40 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
2cf50 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
2cf60 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
2cf70 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2cf80 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
2cf90 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
2cfa0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
2cfb0 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20  pEList = 0;  /* 
2cfc0 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
2cfd0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
2cfe0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2cff0 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
2d000 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
2d010 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
2d020 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
2d030 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
2d040 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
2d050 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
2d060 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
2d070 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
2d080 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
2d090 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
2d0a0 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
2d0b0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
2d0c0 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
2d0d0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
2d0e0 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
2d0f0 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
2d100 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
2d110 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  function */.  Di
2d120 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
2d130 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
2d140 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2d150 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
2d160 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 73 53   */.  SortCtx sS
2d170 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ort;         /* 
2d180 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2d190 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ode the ORDER BY
2d1a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41 67 67   clause */.  Agg
2d1b0 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
2d1c0 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
2d1d0 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
2d1e0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
2d1f0 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
2d200 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
2d210 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
2d220 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
2d230 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
2d240 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2d250 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2d260 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  on */..#ifndef S
2d270 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
2d280 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72  IN.  int iRestor
2d290 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72  eSelectId = pPar
2d2a0 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20  se->iSelectId;. 
2d2b0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
2d2c0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65  Id = pParse->iNe
2d2d0 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65  xtSelectId++;.#e
2d2e0 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61  ndif..  db = pPa
2d2f0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
2d300 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
2d310 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73  cFailed || pPars
2d320 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72  e->nErr ){.    r
2d330 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
2d340 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
2d350 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
2d360 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
2d370 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a   0) ) return 1;.
2d380 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e    memset(&sAggIn
2d390 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  fo, 0, sizeof(sA
2d3a0 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53 45  ggInfo));.#if SE
2d3b0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2d3c0 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c  D.  pParse->nSel
2d3d0 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53  ectIndent++;.  S
2d3e0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2d3f0 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70  rse,p, ("begin p
2d400 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29 29 3b  rocessing:\n"));
2d410 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2d420 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2d430 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2d440 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2d450 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2d460 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
2d470 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2d480 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2d490 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20  RT_DistFifo );. 
2d4a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
2d4b0 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
2d4c0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66  ->eDest!=SRT_Fif
2d4d0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
2d4e0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
2d4f0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
2d500 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a  RT_DistQueue );.
2d510 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2d520 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2d530 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75  t->eDest!=SRT_Qu
2d540 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e  eue );.  if( Ign
2d550 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2d560 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
2d570 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
2d580 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
2d590 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d5a0 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
2d5b0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2d5c0 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
2d5d0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2d5e0 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20  SRT_Discard ||. 
2d5f0 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2d600 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75  >eDest==SRT_Queu
2d610 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  e  || pDest->eDe
2d620 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st==SRT_DistFifo
2d630 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
2d640 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d650 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44  _DistQueue || pD
2d660 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d670 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66  Fifo);.    /* If
2d680 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20   ORDER BY makes 
2d690 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e  no difference in
2d6a0 20 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e   the output then
2d6b0 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20   neither does.  
2d6c0 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f    ** DISTINCT so
2d6d0 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76   it can be remov
2d6e0 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73  ed too. */.    s
2d6f0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2d700 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
2d710 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f  erBy);.    p->pO
2d720 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
2d730 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2d740 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  SF_Distinct;.  }
2d750 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2d760 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
2d770 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  0);.  memset(&sS
2d780 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ort, 0, sizeof(s
2d790 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e  Sort));.  sSort.
2d7a0 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
2d7b0 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69  rderBy;.  pTabLi
2d7c0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2d7d0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
2d7e0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
2d7f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
2d800 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
2d810 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
2d820 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41  List!=0 );.  isA
2d830 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
2d840 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2d850 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54  )!=0;.#if SELECT
2d860 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2d870 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
2d880 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
2d890 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
2d8a0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2d8b0 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72  , ("after name r
2d8c0 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b  esolution:\n"));
2d8d0 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2d8e0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2d8f0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2d900 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e  .  /* Get a poin
2d910 74 65 72 20 74 68 65 20 56 44 42 45 20 75 6e 64  ter the VDBE und
2d920 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2c  er construction,
2d930 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
2d940 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20 20  w VDBE if one.  
2d950 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  ** does not alre
2d960 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 76  ady exist */.  v
2d970 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
2d980 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
2d990 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c   v==0 ) goto sel
2d9a0 65 63 74 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70  ect_end;.  if( p
2d9b0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d9c0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
2d9d0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
2d9e0 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
2d9f0 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20   }..  /* Try to 
2da00 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
2da10 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2da20 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68  lause up into th
2da30 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a  e main query.  *
2da40 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
2da50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2da60 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2da70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2da80 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
2da90 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
2daa0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2dab0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2dac0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2dad0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2dae0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
2daf0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2db00 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74  pSelect;.    int
2db10 20 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54   isAggSub;.    T
2db20 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74  able *pTab = pIt
2db30 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
2db40 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
2db50 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
2db60 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
2db70 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
2db80 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
2db90 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
2dba0 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
2dbb0 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
2dbc0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
2dbd0 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
2dbe0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
2dbf0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
2dc00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2dc10 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
2dc20 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
2dc30 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
2dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc50 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
2dc60 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
2dc70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2dc80 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
2dc90 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2dca0 7d 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20  }..    isAggSub 
2dcb0 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  = (pSub->selFlag
2dcc0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
2dcd0 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c  )!=0;.    if( fl
2dce0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50  attenSubquery(pP
2dcf0 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67  arse, p, i, isAg
2dd00 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a  g, isAggSub) ){.
2dd10 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
2dd20 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
2dd30 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
2dd40 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2dd50 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b   if( isAggSub ){
2dd60 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d  .        isAgg =
2dd70 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   1;.        p->s
2dd80 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
2dd90 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d  gregate;.      }
2dda0 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20  .      i = -1;. 
2ddb0 20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73     }.    pTabLis
2ddc0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
2ddd0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2dde0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2ddf0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
2de00 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
2de10 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
2de20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2de30 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
2de40 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2de50 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
2de60 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
2de70 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64  SELECT.  /* Hand
2de80 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  le compound SELE
2de90 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73  CT statements us
2dea0 69 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65  ing the separate
2deb0 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20   multiSelect(). 
2dec0 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20   ** procedure.. 
2ded0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
2dee0 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ior ){.    rc = 
2def0 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
2df00 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
2df10 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
2df20 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
2df30 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
2df40 53 65 6c 65 63 74 49 64 29 3b 0a 23 69 66 20 53  SelectId);.#if S
2df50 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2df60 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ED.    SELECTTRA
2df70 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(1,pParse,p,("
2df80 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  end compound-sel
2df90 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  ect processing\n
2dfa0 22 29 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  "));.    pParse-
2dfb0 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d  >nSelectIndent--
2dfc0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
2dfd0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
2dfe0 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  if..  /* For eac
2dff0 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  h term in the FR
2e000 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74 77  OM clause, do tw
2e010 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20 28  o things:.  ** (
2e020 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75 6e  1) Authorized un
2e030 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
2e040 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65 72  s.  ** (2) Gener
2e050 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
2e060 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20 2a   sub-queries.  *
2e070 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
2e080 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2e090 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2e0a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2e0b0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
2e0c0 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
2e0d0 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20  tDest dest;.    
2e0e0 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 0a 20  Select *pSub;.. 
2e0f0 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49     /* Issue SQLI
2e100 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
2e110 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61  ations with a fa
2e120 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66  ke column name f
2e130 6f 72 20 61 6e 79 20 74 61 62 6c 65 73 20 74 68  or any tables th
2e140 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 72 65  at.    ** are re
2e150 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f  ferenced but fro
2e160 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65  m which no value
2e170 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e  s are extracted.
2e180 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65   Examples of whe
2e190 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20  re these.    ** 
2e1a0 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51  kinds of null SQ
2e1b0 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
2e1c0 69 7a 61 74 69 6f 6e 73 20 77 6f 75 6c 64 20 6f  izations would o
2e1d0 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ccur:.    **.   
2e1e0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63   **     SELECT c
2e1f0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
2e200 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41     -- SQLITE_REA
2e210 44 20 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20  D t1."".    **  
2e220 20 20 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46     SELECT t1.* F
2e230 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d  ROM t1, t2;   --
2e240 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e   SQLITE_READ t2.
2e250 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  "".    **.    **
2e260 20 54 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   The fake column
2e270 20 6e 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74   name is an empt
2e280 79 20 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73  y string.  It is
2e290 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
2e2a0 74 61 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20  table to.    ** 
2e2b0 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61  have a column na
2e2c0 6d 65 64 20 62 79 20 74 68 65 20 65 6d 70 74 79  med by the empty
2e2d0 20 73 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63   string, in whic
2e2e0 68 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  h case there is 
2e2f0 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a  no way to.    **
2e300 20 64 69 73 74 69 6e 67 75 69 73 68 20 62 65 74   distinguish bet
2e310 77 65 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65  ween an unrefere
2e320 6e 63 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61  nced table and a
2e330 6e 20 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e  n actual referen
2e340 63 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ce to the.    **
2e350 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65   "" column.  The
2e360 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
2e370 20 77 61 73 20 66 6f 72 20 74 68 65 20 66 61 6b   was for the fak
2e380 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f  e column name to
2e390 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20   be a NULL,.    
2e3a0 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 62  ** which would b
2e3b0 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20  e unambiguous.  
2e3c0 42 75 74 20 6c 65 67 61 63 79 20 61 75 74 68 6f  But legacy autho
2e3d0 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
2e3e0 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  ks might.    ** 
2e3f0 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d  assume the colum
2e400 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55  n name is non-NU
2e410 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c 74 2e  LL and segfault.
2e420 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 6e 20    The use of an 
2e430 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20  empty string.   
2e440 20 2a 2a 20 66 6f 72 20 74 68 65 20 66 61 6b 65   ** for the fake
2e450 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65   column name see
2e460 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f  ms safer..    */
2e470 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2e480 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20  colUsed==0 ){.  
2e490 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 43      sqlite3AuthC
2e4a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2e4b0 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d  ITE_READ, pItem-
2e4c0 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49 74 65  >zName, "", pIte
2e4d0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
2e4e0 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
2e4f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
2e500 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
2e510 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2e520 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20 47 65  _VIEW).    /* Ge
2e530 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
2e540 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20  all sub-queries 
2e550 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2e560 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 53  se.    */.    pS
2e570 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
2e580 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75  ect;.    if( pSu
2e590 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
2e5a0 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d  ..    /* Sometim
2e5b0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
2e5c0 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20  a subquery will 
2e5d0 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72  be generated mor
2e5e0 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e  e than.    ** on
2e5f0 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75  ce, if the subqu
2e600 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74  ery is part of t
2e610 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2e620 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a  in a LEFT JOIN,.
2e630 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70      ** for examp
2e640 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
2e650 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65  e, do not regene
2e660 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
2e670 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a   manifest.    **
2e680 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63   a view or the c
2e690 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70  o-routine to imp
2e6a0 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20  lement a view.  
2e6b0 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  The first instan
2e6c0 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66  ce.    ** is suf
2e6d0 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20  ficient, though 
2e6e0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
2e6f0 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76  o manifest the v
2e700 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20  iew does need.  
2e710 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b    ** to be invok
2e720 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20  ed again. */.   
2e730 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
2e740 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
2e750 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
2e760 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29  iaCoroutine==0 )
2e770 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2e780 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2e790 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65 20 76   manifests the v
2e7a0 69 65 77 20 6d 69 67 68 74 20 62 65 20 61 20 6f  iew might be a o
2e7b0 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c  ne-time routine,
2e7c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 69  .        ** or i
2e7d0 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  t might need to 
2e7e0 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61 63 68  be rerun on each
2e7f0 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63 61 75   iteration becau
2e800 73 65 20 69 74 0a 20 20 20 20 20 20 20 20 2a 2a  se it.        **
2e810 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72 72 65   encodes a corre
2e820 6c 61 74 65 64 20 73 75 62 71 75 65 72 79 2e 20  lated subquery. 
2e830 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  */.        testc
2e840 61 73 65 28 20 73 71 6c 69 74 65 33 56 64 62 65  ase( sqlite3Vdbe
2e850 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e  GetOp(v, pItem->
2e860 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70  addrFillSub)->op
2e870 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b  code==OP_Once );
2e880 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e890 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2e8a0 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72  _Gosub, pItem->r
2e8b0 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  egReturn, pItem-
2e8c0 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20  >addrFillSub);. 
2e8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e       }.      con
2e8e0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
2e8f0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
2e900 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
2e910 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
2e920 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
2e930 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
2e940 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
2e950 74 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74  this, the parent
2e960 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69   select. The chi
2e970 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a  ld select.    **
2e980 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70   may contain exp
2e990 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66  ression trees of
2e9a0 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20   at most.    ** 
2e9b0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  (SQLITE_MAX_EXPR
2e9c0 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65  _DEPTH-Parse.nHe
2e9d0 69 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68  ight) height. Th
2e9e0 69 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20  is is a bit.    
2e9f0 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61  ** more conserva
2ea00 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73  tive than necess
2ea10 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61  ary, but much ea
2ea20 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63  sier than enforc
2ea30 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78  ing.    ** an ex
2ea40 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a  act limit..    *
2ea50 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  /.    pParse->nH
2ea60 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33  eight += sqlite3
2ea70 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74  SelectExprHeight
2ea80 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  (p);..    /* Mak
2ea90 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73  e copies of cons
2eaa0 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73  tant WHERE-claus
2eab0 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f  e terms in the o
2eac0 75 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a  uter query down.
2ead0 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68      ** inside th
2eae0 65 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69  e subquery.  Thi
2eaf0 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73  s can help the s
2eb00 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d  ubquery to run m
2eb10 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e  ore efficiently.
2eb20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2eb30 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
2eb40 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d  ype & JT_OUTER)=
2eb50 3d 30 0a 20 20 20 20 20 26 26 20 70 75 73 68 44  =0.     && pushD
2eb60 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50  ownWhereTerms(pP
2eb70 61 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70  arse, pSub, p->p
2eb80 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43  Where, pItem->iC
2eb90 75 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69  ursor).    ){.#i
2eba0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
2ebb0 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20  ABLED.      if( 
2ebc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2ebd0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2ebe0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
2ebf0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
2ec00 2c 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63  ,("After WHERE-c
2ec10 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a  lause push-down:
2ec20 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  \n"));.        s
2ec30 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
2ec40 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
2ec50 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2ec60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
2ec70 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70  rate code to imp
2ec80 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75  lement the subqu
2ec90 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ery.    **.    *
2eca0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69  * The subquery i
2ecb0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
2ecc0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66   a co-routine if
2ecd0 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
2ece0 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20 20  e true:.    **  
2ecf0 20 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65   (1)  The subque
2ed00 72 79 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ry is guaranteed
2ed10 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72   to be the outer
2ed20 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69   loop (so that i
2ed30 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
2ed40 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
2ed50 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72   be computed mor
2ed60 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20  e than once).   
2ed70 20 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 41   **   (2)  The A
2ed80 4c 4c 20 6b 65 79 77 6f 72 64 20 61 66 74 65 72  LL keyword after
2ed90 20 53 45 4c 45 43 54 20 69 73 20 6f 6d 69 74 74   SELECT is omitt
2eda0 65 64 2e 20 20 28 41 70 70 6c 69 63 61 74 69 6f  ed.  (Applicatio
2edb0 6e 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20  ns are.    **   
2edc0 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20       allowed to 
2edd0 73 61 79 20 22 53 45 4c 45 43 54 20 41 4c 4c 22  say "SELECT ALL"
2ede0 20 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74   instead of just
2edf0 20 22 53 45 4c 45 43 54 22 20 74 6f 20 64 69 73   "SELECT" to dis
2ee00 61 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  able.    **     
2ee10 20 20 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f     the use of co
2ee20 2d 72 6f 75 74 69 6e 65 73 2e 29 0a 20 20 20 20  -routines.).    
2ee30 2a 2a 20 20 20 28 33 29 20 20 43 6f 2d 72 6f 75  **   (3)  Co-rou
2ee40 74 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 64 69  tines are not di
2ee50 73 61 62 6c 65 64 20 75 73 69 6e 67 20 73 71 6c  sabled using sql
2ee60 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2ee70 6c 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  l().    **      
2ee80 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45    with SQLITE_TE
2ee90 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
2eea0 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  IONS..    **.   
2eeb0 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68   ** TODO: Are th
2eec0 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ere other reason
2eed0 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20  s beside (1) to 
2eee0 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  use a co-routine
2eef0 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  .    ** implemen
2ef00 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20  tation?.    */. 
2ef10 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20     if( i==0.    
2ef20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
2ef30 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
2ef40 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
2ef50 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
2ef60 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
2ef70 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31  OSS))!=0)  /* (1
2ef80 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 28 70 2d  ) */.     && (p-
2ef90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41  >selFlags & SF_A
2efa0 6c 6c 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  ll)==0          
2efb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efc0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
2efd0 2a 2f 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d  */.     && Optim
2efe0 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64  izationEnabled(d
2eff0 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f  b, SQLITE_SubqCo
2f000 72 6f 75 74 69 6e 65 29 20 20 20 20 20 20 20 20  routine)        
2f010 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f         /* (3) */
2f020 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2f030 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
2f040 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
2f050 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
2f060 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
2f070 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
2f080 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
2f090 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
2f0a0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
2f0b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2f0c0 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
2f0d0 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2f0e0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2f0f0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2f100 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2f110 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  v, OP_InitCorout
2f120 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  ine, pItem->regR
2f130 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f  eturn, 0, addrTo
2f140 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
2f150 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
2f160 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
2f170 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  me));.      pIte
2f180 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
2f190 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
2f1a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2f1b0 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2f1c0 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  _Coroutine, pIte
2f1d0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2f1e0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2f1f0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2f200 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2f210 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2f220 49 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Id);.      sqlit
2f230 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
2f240 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
2f250 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
2f260 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
2f270 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
2f280 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
2f290 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
2f2a0 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
2f2b0 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
2f2c0 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
2f2d0 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
2f2e0 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e  utine(v, pItem->
2f2f0 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2f300 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2f310 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
2f320 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
2f330 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
2f340 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
2f350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
2f360 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
2f370 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
2f380 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
2f390 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
2f3a0 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
2f3b0 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
2f3c0 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
2f3d0 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
2f3e0 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
2f3f0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2f400 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
2f410 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
2f420 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
2f430 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
2f440 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
2f450 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
2f460 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
2f470 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
2f480 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
2f490 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
2f4a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
2f4b0 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73  retAddr;.      s
2f4c0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2f4d0 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20  em *pPrior;..   
2f4e0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
2f4f0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
2f500 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
2f510 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
2f520 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2f530 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
2f540 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2f550 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2f560 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2f570 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
2f580 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
2f590 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
2f5a0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
2f5b0 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b  Correlated==0 ){
2f5c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2f5d0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
2f5e0 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e  ot correlated an
2f5f0 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
2f600 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20  inside of.      
2f610 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20    ** a trigger, 
2f620 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65  then we only nee
2f630 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
2f640 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75   value of the su
2f650 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a  bquery.        *
2f660 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  * once. */.     
2f670 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71     onceAddr = sq
2f680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
2f690 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
2f6a0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2f6b0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2f6c0 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
2f6d0 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
2f6e0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2f6f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f700 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43         VdbeNoopC
2f710 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
2f720 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
2f730 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
2f740 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ame));.      }. 
2f750 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73       pPrior = is
2f760 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61  SelfJoinView(pTa
2f770 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20  bList, pItem);. 
2f780 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
2f790 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2f7a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2f7b0 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65  OP_OpenDup, pIte
2f7c0 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69  m->iCursor, pPri
2f7d0 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  or->iCursor);.  
2f7e0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
2f7f0 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69  Integer(pItem->i
2f800 53 65 6c 65 63 74 49 64 2c 20 70 50 72 69 6f 72  SelectId, pPrior
2f810 2d 3e 69 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  ->iSelectId);.  
2f820 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2f830 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30  rior->pSelect!=0
2f840 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62   );.        pSub
2f850 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
2f860 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  Prior->pSelect->
2f870 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
2f880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f890 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
2f8a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
2f8b0 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
2f8c0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
2f8d0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
2f8e0 6e 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53  nteger(pItem->iS
2f8f0 65 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61  electId, (u8)pPa
2f900 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
2f910 49 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Id);.        sql
2f920 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
2f930 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
2f940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2f950 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
2f960 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e  LogEst = pSub->n
2f970 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
2f980 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
2f990 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
2f9a0 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
2f9b0 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
2f9c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2f9d0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2f9e0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2f9f0 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
2fa00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
2fa10 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
2fa20 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2fa30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2fa40 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
2fa50 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
2fa60 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
2fa70 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
2fa80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2fa90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2faa0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
2fab0 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  end;.    pParse-
2fac0 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69  >nHeight -= sqli
2fad0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
2fae0 67 68 74 28 70 29 3b 0a 23 65 6e 64 69 66 0a 20  ght(p);.#endif. 
2faf0 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73   }..  /* Various
2fb00 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
2fb10 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69   SELECT copied i
2fb20 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  nto local variab
2fb30 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  les for.  ** con
2fb40 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45  venience */.  pE
2fb50 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
2fb60 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
2fb70 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
2fb80 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
2fb90 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
2fba0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
2fbb0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
2fbc0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2fbd0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
2fbe0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2fbf0 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2fc00 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2fc10 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
2fc20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
2fc30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
2fc40 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  er all FROM-clau
2fc50 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  se analysis:\n")
2fc60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2fc70 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2fc80 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2fc90 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
2fca0 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
2fcb0 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
2fcc0 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2fcd0 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
2fce0 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
2fcf0 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
2fd00 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
2fd10 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
2fd20 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
2fd30 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2fd40 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2fd50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
2fd60 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
2fd70 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
2fd80 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
2fd90 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
2fda0 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
2fdb0 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
2fdc0 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
2fdd0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
2fde0 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
2fdf0 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
2fe00 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
2fe10 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
2fe20 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
2fe30 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
2fe40 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
2fe50 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
2fe60 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
2fe70 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
2fe80 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
2fe90 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
2fea0 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
2feb0 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
2fec0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
2fed0 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
2fee0 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52   GROUP BY xyz OR
2fef0 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
2ff00 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
2ff10 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
2ff20 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
2ff30 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
2ff40 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
2ff50 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
2ff60 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
2ff70 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
2ff80 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
2ff90 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
2ffa0 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
2ffb0 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
2ffc0 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
2ffd0 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
2ffe0 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
2fff0 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
30000 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
30010 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
30020 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
30030 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
30040 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
30050 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
30060 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
30070 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
30080 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
30090 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74  pOrderBy, pEList
300a0 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
300b0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
300c0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
300d0 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
300e0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
300f0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
30100 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
30110 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
30120 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
30130 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
30140 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
30150 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
30160 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
30170 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
30180 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
30190 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
301a0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
301b0 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
301c0 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
301d0 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
301e0 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
301f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
30200 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
30210 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
30220 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
30230 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
30240 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
30250 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
30260 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
30270 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49  p,("Transform DI
30280 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55  STINCT into GROU
30290 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  P BY:\n"));.    
302a0 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
302b0 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
302c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
302d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
302e0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
302f0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
30300 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
30310 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
30320 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
30330 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
30340 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
30350 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
30360 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
30370 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
30380 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
30390 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
303a0 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
303b0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
303c0 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
303d0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
303e0 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
303f0 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
30400 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
30410 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
30420 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
30430 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
30440 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
30450 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
30460 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
30470 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
30480 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
30490 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
304a0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
304b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
304c0 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
304d0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
304e0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
304f0 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
30500 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
30510 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
30520 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
30530 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
30540 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
30550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
30560 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
30570 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
30580 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
30590 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
305a0 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
305b0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
305c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
305d0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
305e0 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
305f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
30600 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
30610 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
30620 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
30630 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
30640 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
30650 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
30660 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
30670 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
30680 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
30690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
306a0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
306b0 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
306c0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
306d0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
306e0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
306f0 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
30700 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
30710 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70  bel(v);.  if( (p
30720 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
30730 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29  FixedLimit)==0 )
30740 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  {.    p->nSelect
30750 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
30760 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
30770 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69  .  }.  computeLi
30780 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
30790 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
307a0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
307b0 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
307c0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
307d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
307e0 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53  angeOpcode(v, sS
307f0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
30800 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  x, OP_SorterOpen
30810 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72  );.    sSort.sor
30820 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c  tFlags |= SORTFL
30830 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  AG_UseSorter;.  
30840 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20  }..  /* Open an 
30850 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
30860 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
30870 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
30880 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
30890 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
308a0 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
308b0 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
308c0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
308d0 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
308e0 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
308f0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
30900 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
30910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30920 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
30930 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
30940 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
30950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30960 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72  (char*)keyInfoFr
30970 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
30980 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30  e, p->pEList,0,0
30990 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
309a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309b0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
309c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
309d0 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
309e0 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
309f0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
30a00 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
30a10 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
30a20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
30a30 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
30a40 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
30a50 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
30a60 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
30a70 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBy==0 ){.    /*
30a80 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   No aggregate fu
30a90 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47  nctions and no G
30aa0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
30ab0 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46  /.    u16 wctrlF
30ac0 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63  lags = (sDistinc
30ad0 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45  t.isTnct ? WHERE
30ae0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a  _WANT_DISTINCT :
30af0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
30b00 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
30b10 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20  ==SF_FixedLimit 
30b20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  );.    wctrlFlag
30b30 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  s |= p->selFlags
30b40 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
30b50 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
30b60 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
30b70 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f  n. */.    pWInfo
30b80 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
30b90 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
30ba0 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73  bList, pWhere, s
30bb0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20  Sort.pOrderBy,. 
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
30be0 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c  >pEList, wctrlFl
30bf0 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ags, p->nSelectR
30c00 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49  ow);.    if( pWI
30c10 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
30c20 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
30c30 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  ( sqlite3WhereOu
30c40 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
30c50 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63  nfo) < p->nSelec
30c60 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  tRow ){.      p-
30c70 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
30c80 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
30c90 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
30ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30cb0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
30cc0 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65   && sqlite3Where
30cd0 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
30ce0 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73  o) ){.      sDis
30cf0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
30d00 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
30d10 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
30d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30d30 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
30d40 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f  {.      sSort.nO
30d50 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68  BSat = sqlite3Wh
30d60 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
30d70 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72  nfo);.      sSor
30d80 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  t.bOrderedInnerL
30d90 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65  oop = sqlite3Whe
30da0 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  reOrderedInnerLo
30db0 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  op(pWInfo);.    
30dc0 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53    if( sSort.nOBS
30dd0 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72  at==sSort.pOrder
30de0 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
30df0 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65       sSort.pOrde
30e00 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rBy = 0;.      }
30e10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
30e20 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  f sorting index 
30e30 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64  that was created
30e40 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f   by a prior OP_O
30e50 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20  penEphemeral .  
30e60 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
30e70 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65   ended up not be
30e80 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e  ing needed, then
30e90 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   change the OP_O
30ea0 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20  penEphemeral.   
30eb0 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e   ** into an OP_N
30ec0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
30ed0 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  if( sSort.addrSo
30ee0 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53  rtIndex>=0 && sS
30ef0 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20  ort.pOrderBy==0 
30f00 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30f10 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
30f20 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
30f30 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a  rtIndex);.    }.
30f40 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
30f50 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
30f60 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  oop. */.    asse
30f70 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70  rt( p->pEList==p
30f80 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 65 6c  EList );.    sel
30f90 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
30fa0 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f  rse, p, -1, &sSo
30fb0 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20  rt, &sDistinct, 
30fc0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
30fd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30fe0 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c  e3WhereContinueL
30ff0 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20  abel(pWInfo),.  
31000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31010 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72    sqlite3WhereBr
31020 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
31030 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74  );..    /* End t
31040 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
31050 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
31060 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
31070 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
31080 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
31090 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20  case when there 
310a0 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20  exist aggregate 
310b0 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47  functions or a G
310c0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20  ROUP BY clause. 
310d0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f     ** or both */
310e0 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
310f0 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
31100 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
31110 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
31120 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
31130 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
31140 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
31150 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
31160 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
31170 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
31180 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
31190 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
311a0 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
311b0 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
311c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
311d0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
311e0 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
311f0 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
31200 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
31210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31220 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
31230 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
31240 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
31250 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
31260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31270 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
31280 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
31290 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
312a0 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
312b0 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
312c0 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
312d0 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
312e0 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
312f0 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
31300 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
31310 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
31320 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
31330 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
31340 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
31350 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  ELECT */.    int
31360 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20   sortPTab = 0;  
31370 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20   /* Pseudotable 
31380 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73  used to decode s
31390 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  orting results *
313a0 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75  /.    int sortOu
313b0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74  t = 0;    /* Out
313c0 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f  put register fro
313d0 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  m the sorter */.
313e0 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79 47      int orderByG
313f0 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65 20  rp = 0; /* True 
31400 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  if the GROUP BY 
31410 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72 65  and ORDER BY are
31420 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20 20   the same */..  
31430 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
31440 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
31450 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
31460 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
31470 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
31480 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
31490 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
314a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20  {.      int k;  
314b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314c0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
314d0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
314e0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
314f0 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
31500 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
31510 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
31520 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
31530 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(k=p->pEList-
31540 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
31550 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b  >pEList->a; k>0;
31560 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
31570 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
31580 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
31590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
315a0 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (k=pGroupBy->nEx
315b0 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
315c0 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  By->a; k>0; k--,
315d0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
315e0 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
315f0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
31600 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
31610 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  66==sqlite3LogEs
31620 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20 20  t(100) );.      
31630 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
31640 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65 63  w>66 ) p->nSelec
31650 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20 7d  tRow = 66;.    }
31660 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
31670 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  rt( 0==sqlite3Lo
31680 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20 20  gEst(1) );.     
31690 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
316a0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
316b0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
316c0 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e  th a GROUP BY an
316d0 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  d an ORDER BY cl
316e0 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72  ause and they ar
316f0 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69 63  e.    ** identic
31700 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  al, then it may 
31710 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  be possible to d
31720 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52  isable the ORDER
31730 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20 20   BY clause .    
31740 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e 64  ** on the ground
31750 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55 50  s that the GROUP
31760 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20 65   BY will cause e
31770 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20  lements to come 
31780 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20 74  out .    ** in t
31790 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
317a0 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e 6f  . It also may no
317b0 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42 59  t - the GROUP BY
317c0 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20 20   might use a.   
317d0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e 64   ** database ind
317e0 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20 72  ex that causes r
317f0 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70 65  ows to be groupe
31800 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72 65  d together as re
31810 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62 75  quired.    ** bu
31820 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 73  t not actually s
31830 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77 61  orted. Either wa
31840 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  y, record the fa
31850 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ct that the.    
31860 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  ** ORDER BY and 
31870 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73  GROUP BY clauses
31880 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62 79   are the same by
31890 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72 64   setting the ord
318a0 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20 76  erByGrp.    ** v
318b0 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  ariable.  */.   
318c0 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
318d0 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72 6f  ListCompare(pGro
318e0 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72 64  upBy, sSort.pOrd
318f0 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  erBy, -1)==0 ){.
31900 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72 70        orderByGrp
31910 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20 20   = 1;.    }. .  
31920 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
31930 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
31940 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
31950 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
31960 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
31970 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
31980 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
31990 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
319a0 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
319b0 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
319c0 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
319d0 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
319e0 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
319f0 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
31a00 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
31a10 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
31a20 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
31a30 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
31a40 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
31a50 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
31a60 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
31a70 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
31a80 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
31a90 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
31aa0 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
31ab0 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70  ggInfo.mnReg = p
31ac0 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
31ad0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
31ae0 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
31af0 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
31b00 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
31b10 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
31b20 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
31b30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
31b40 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
31b50 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
31b60 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
31b70 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
31b80 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b  sSort.pOrderBy);
31b90 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
31ba0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47   ){.      if( pG
31bb0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
31bc0 20 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65    assert( pWhere
31bd0 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20  ==p->pWhere );. 
31be0 20 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57         havingToW
31bf0 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 47 72  here(pParse, pGr
31c00 6f 75 70 42 79 2c 20 70 48 61 76 69 6e 67 2c 20  oupBy, pHaving, 
31c10 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
31c20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d       pWhere = p-
31c30 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d  >pWhere;.      }
31c40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
31c50 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
31c60 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e  tes(&sNC, pHavin
31c70 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  g);.    }.    sA
31c80 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61  ggInfo.nAccumula
31c90 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e  tor = sAggInfo.n
31ca0 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28  Column;.    for(
31cb0 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
31cc0 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
31cd0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
31ce0 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67  HasProperty(sAgg
31cf0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
31d00 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
31d10 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
31d20 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e  ncFlags |= NC_In
31d30 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  AggFunc;.      s
31d40 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
31d50 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73  eAggList(&sNC, s
31d60 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
31d70 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29  .pExpr->x.pList)
31d80 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
31d90 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67  ags &= ~NC_InAgg
31da0 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Func;.    }.    
31db0 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d  sAggInfo.mxReg =
31dc0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
31dd0 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
31de0 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73  cFailed ) goto s
31df0 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20  elect_end;..    
31e00 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f  /* Processing fo
31e10 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74  r aggregates wit
31e20 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65  h GROUP BY is ve
31e30 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64  ry different and
31e40 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72  .    ** much mor
31e50 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61  e complex than a
31e60 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75  ggregates withou
31e70 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20  t a GROUP BY..  
31e80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
31e90 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b  oupBy ){.      K
31ea0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
31eb0 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66  ;  /* Keying inf
31ec0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
31ed0 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65   group by clause
31ee0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
31ef0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dr1;          /*
31f00 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73   A-vs-B comparis
31f10 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20  ion jump */.    
31f20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74    int addrOutput
31f30 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f  Row;  /* Start o
31f40 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  f subroutine tha
31f50 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75  t outputs a resu
31f60 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  lt row */.      
31f70 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77  int regOutputRow
31f80 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64  ;   /* Return ad
31f90 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
31fa0 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  or output subrou
31fb0 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tine */.      in
31fc0 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20  t addrSetAbort; 
31fd0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f    /* Set the abo
31fe0 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75  rt flag and retu
31ff0 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rn */.      int 
32000 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20  addrTopOfLoop;  
32010 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
32020 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  put loop */.    
32030 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e    int addrSortin
32040 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f  gIdx; /* The OP_
32050 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f  OpenEphemeral fo
32060 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
32070 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
32080 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20   addrReset;     
32090 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66   /* Subroutine f
320a0 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65  or resetting the
320b0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a   accumulator */.
320c0 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73        int regRes
320d0 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74  et;       /* Ret
320e0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
320f0 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73  ster for reset s
32100 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20  ubroutine */..  
32110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
32120 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  is a GROUP BY cl
32130 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65  ause we might ne
32140 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  ed a sorting ind
32150 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69  ex to.      ** i
32160 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c  mplement it.  Al
32170 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74  locate that sort
32180 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20  ing index now.  
32190 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a  If it turns out.
321a0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
321b0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20   do not need it 
321c0 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f  after all, the O
321d0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  P_SorterOpen ins
321e0 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  truction.      *
321f0 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  * will be conver
32200 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e  ted into a Noop.
32210 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20    .      */.    
32220 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
32230 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e  ngIdx = pParse->
32240 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b  nTab++;.      pK
32250 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
32260 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
32270 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  rse, pGroupBy, 0
32280 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  , sAggInfo.nColu
32290 6d 6e 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53  mn);.      addrS
322a0 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69  ortingIdx = sqli
322b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
322c0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
322d0 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49  .          sAggI
322e0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
322f0 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e  sAggInfo.nSortin
32300 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20  gColumn, .      
32310 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b      0, (char*)pK
32320 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
32330 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FO);..      /* I
32340 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
32350 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
32360 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
32370 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
32380 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32390 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
323a0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
323b0 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
323c0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
323d0 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
323e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
323f0 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  m;.      addrOut
32400 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
32410 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
32420 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
32430 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
32440 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  m;.      addrRes
32450 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
32460 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
32470 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
32480 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
32490 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
324a0 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
324b0 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
324c0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
324d0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
324e0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
324f0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
32500 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
32510 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
32520 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
32530 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
32540 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
32550 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
32560 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
32570 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
32580 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61  eger, 0, iUseFla
32590 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
325a0 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
325b0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
325c0 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20  empty"));.      
325d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
325e0 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
325f0 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47   iAMem, iAMem+pG
32600 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29  roupBy->nExpr-1)
32610 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;..      /* Begi
32620 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  n a loop that wi
32630 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73  ll extract all s
32640 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52  ource rows in GR
32650 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20  OUP BY order..  
32660 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
32670 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65  t involve two se
32680 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74  parate loops wit
32690 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20  h an OP_Sort in 
326a0 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20  between, or.    
326b0 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
326c0 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74   a single loop t
326d0 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65  hat uses an inde
326e0 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66  x to extract inf
326f0 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a  ormation.      *
32700 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f  * in the right o
32710 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69  rder to begin wi
32720 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  th..      */.   
32730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
32740 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
32750 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
32760 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57  Reset);.      pW
32770 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
32780 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
32790 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
327a0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a  e, pGroupBy, 0,.
327b0 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
327c0 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72  GROUPBY | (order
327d0 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f  ByGrp ? WHERE_SO
327e0 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20  RTBYGROUP : 0), 
327f0 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  0.      );.     
32800 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
32810 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
32820 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
32830 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
32840 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75  d(pWInfo)==pGrou
32850 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  pBy->nExpr ){.  
32860 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
32870 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
32880 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
32890 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
328a0 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
328b0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
328c0 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
328d0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
328e0 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
328f0 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
32900 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
32910 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
32920 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
32930 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
32940 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
32950 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
32960 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
32970 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
32980 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
32990 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
329a0 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
329b0 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
329c0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
329d0 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
329e0 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
329f0 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
32a00 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
32a10 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
32a20 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
32a30 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
32a40 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
32a50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
32a60 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
32a70 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
32a80 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
32a90 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
32aa0 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
32ab0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d        explainTem
32ac0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a  pTable(pParse, .
32ad0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69              (sDi
32ae0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
32af0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46   (p->selFlags&SF
32b00 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f  _Distinct)==0) ?
32b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32b20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20       "DISTINCT" 
32b30 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  : "GROUP BY");..
32b40 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
32b50 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
32b60 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
32b70 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
32b80 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
32b90 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20  upBy;.        j 
32ba0 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
32bb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
32bc0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
32bd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
32be0 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
32bf0 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
32c00 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
32c10 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
32c20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
32c30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32c40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
32c50 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
32c60 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
32c70 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
32c80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
32c90 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
32ca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32cb0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
32cc0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
32cd0 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30  y, regBase, 0, 0
32ce0 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  );.        j = n
32cf0 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20  GroupBy;.       
32d00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
32d10 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
32d20 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
32d30 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
32d40 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
32d50 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
32d60 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
32d70 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
32d80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32d90 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
32da0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
32db0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
32dc0 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28  eGetColumnToReg(
32dd0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
32de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32df0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54          pCol->pT
32e00 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d  ab, pCol->iColum
32e10 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c  n, pCol->iTable,
32e20 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   r1);.          
32e30 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
32e40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
32e50 20 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d       regRecord =
32e60 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
32e70 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
32e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
32e90 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
32ea0 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
32eb0 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64   nCol, regRecord
32ec0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32ed0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32ee0 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c  OP_SorterInsert,
32ef0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
32f00 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
32f10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32f20 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
32f30 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
32f40 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
32f50 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
32f60 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
32f70 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
32f80 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
32f90 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
32fa0 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f       sAggInfo.so
32fb0 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73  rtingIdxPTab = s
32fc0 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72 73 65  ortPTab = pParse
32fd0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
32fe0 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69    sortOut = sqli
32ff0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
33000 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
33010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
33020 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
33030 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72  o, sortPTab, sor
33040 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  tOut, nCol);.   
33050 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33060 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
33070 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66  terSort, sAggInf
33080 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
33090 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  drEnd);.        
330a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
330b0 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29  "GROUP BY sort")
330c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
330d0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  v);.        sAgg
330e0 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49  Info.useSortingI
330f0 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dx = 1;.        
33100 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
33110 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a  Clear(pParse);..
33120 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
33130 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f  * If the index o
33140 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  r temporary tabl
33150 65 20 75 73 65 64 20 62 79 20 74 68 65 20 47 52  e used by the GR
33160 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20  OUP BY sort.    
33170 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61    ** will natura
33180 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73  lly deliver rows
33190 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65   in the order re
331a0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
331b0 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20  DER BY.      ** 
331c0 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74  clause, cancel t
331d0 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  he ephemeral tab
331e0 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61  le open coded ea
331f0 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  rlier..      **.
33200 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
33210 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
33220 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20 61   - the correct a
33230 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73  nswer should res
33240 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a  ult regardless..
33250 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65        ** Use the
33260 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
33270 72 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53  rder flag with S
33280 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
33290 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20  PTIMIZER to .   
332a0 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68     ** disable th
332b0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
332c0 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70  for testing purp
332d0 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  oses.  */.      
332e0 69 66 28 20 6f 72 64 65 72 42 79 47 72 70 20 26  if( orderByGrp &
332f0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
33300 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
33310 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a  _GroupByOrder) .
33320 20 20 20 20 20 20 20 26 26 20 28 67 72 6f 75 70         && (group
33330 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65  BySort || sqlite
33340 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28 70  3WhereIsSorted(p
33350 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b  WInfo)).      ){
33360 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
33370 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
33380 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33390 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
333a0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
333b0 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  dex);.      }.. 
333c0 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
333d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
333e0 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
333f0 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
33400 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
33410 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
33420 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
33430 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
33440 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
33450 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
33460 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
33470 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
33480 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
33490 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
334a0 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
334b0 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
334c0 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
334d0 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
334e0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
334f0 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
33500 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
33510 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
33520 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
33530 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
33540 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
33550 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
33560 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
33570 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
33580 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
33590 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  x,.             
335a0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 72               sor
335b0 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b  tOut, sortPTab);
335c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
335d0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
335e0 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
335f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
33600 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
33610 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33620 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
33630 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
33640 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
33650 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33660 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
33670 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
33680 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33690 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
336a0 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
336b0 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
336c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
336d0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
336e0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
336f0 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
33700 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
33710 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
33720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33730 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
33740 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
33750 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
33760 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  O);.      addr1 
33770 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
33780 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
33790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
337a0 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
337b0 20 61 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64   addr1+1, 0, add
337c0 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  r1+1); VdbeCover
337d0 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  age(v);..      /
337e0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
337f0 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
33800 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
33810 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
33820 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
33830 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
33840 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
33850 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
33860 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
33870 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
33880 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
33890 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
338a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
338b0 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
338c0 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
338d0 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
338e0 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
338f0 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
33900 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
33910 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
33920 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
33930 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
33940 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
33950 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
33960 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
33970 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
33980 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
33990 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
339a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
339b0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
339c0 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
339d0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
339e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
339f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
33a00 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
33a10 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
33a20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
33a30 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
33a40 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
33a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
33a60 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
33a70 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
33a80 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  drEnd); VdbeCove
33a90 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
33aa0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
33ab0 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
33ac0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
33ad0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
33ae0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
33af0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
33b00 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
33b10 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
33b20 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
33b30 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
33b40 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
33b50 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
33b60 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
33b70 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
33b80 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
33b90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
33ba0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
33bb0 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70  addr1);.      up
33bc0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
33bd0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
33be0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
33bf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
33c00 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
33c10 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
33c20 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
33c30 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
33c40 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
33c50 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
33c60 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
33c70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
33c80 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
33c90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33ca0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
33cb0 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66  terNext, sAggInf
33cc0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64  o.sortingIdx, ad
33cd0 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20  drTopOfLoop);.  
33ce0 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
33cf0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ge(v);.      }el
33d00 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
33d10 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
33d20 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  fo);.        sql
33d30 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
33d40 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74  Noop(v, addrSort
33d50 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d  ingIdx);.      }
33d60 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
33d70 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
33d80 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
33d90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
33da0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
33db0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
33dc0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
33dd0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
33de0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
33df0 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
33e00 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
33e10 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
33e20 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
33e30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33e40 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29  Goto(v, addrEnd)
33e50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
33e60 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
33e70 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
33e80 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
33e90 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
33ea0 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75  ** set.  This su
33eb0 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c  broutine first l
33ec0 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65  ooks at the iUse
33ed0 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c  Flag.  If iUseFl
33ee0 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c  ag.      ** is l
33ef0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
33f00 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73  l to zero, the s
33f10 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  ubroutine is a n
33f20 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20  o-op.  If.      
33f30 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  ** the processin
33f40 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  g calls for the 
33f50 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20  query to abort, 
33f60 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a  this subroutine.
33f70 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65        ** increme
33f80 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c  nts the iAbortFl
33f90 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ag memory locati
33fa0 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  on before return
33fb0 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ing in.      ** 
33fc0 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20  order to signal 
33fd0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62  the caller to ab
33fe0 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ort..      */.  
33ff0 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74      addrSetAbort
34000 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
34010 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
34020 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34030 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
34040 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c  ger, 1, iAbortFl
34050 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
34060 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20  omment((v, "set 
34070 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
34080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
34090 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
340a0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
340b0 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  w);.      sqlite
340c0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
340d0 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52  l(v, addrOutputR
340e0 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  ow);.      addrO
340f0 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
34100 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
34110 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
34120 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34130 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46   OP_IfPos, iUseF
34140 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52  lag, addrOutputR
34150 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62  ow+2);.      Vdb
34160 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
34170 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
34180 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
34190 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
341a0 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
341b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
341c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
341d0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
341e0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
341f0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
34200 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
34210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
34220 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
34230 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
34240 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
34250 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
34260 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
34270 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
34280 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 0a 20 20  , -1, &sSort,.  
34290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342a0 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
342b0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
342c0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
342d0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
342e0 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
342f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34300 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
34310 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
34320 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
34330 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
34340 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
34350 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
34360 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
34370 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
34380 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
34390 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
343a0 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
343b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
343c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
343d0 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
343e0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
343f0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
34400 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
34410 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
34420 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
34430 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d  et);.     .    }
34440 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
34450 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65  By.  Begin aggre
34460 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74  gate queries wit
34470 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a  hout GROUP BY: *
34480 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
34490 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
344a0 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
344b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
344c0 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
344d0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
344e0 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
344f0 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
34500 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
34510 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
34520 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
34530 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
34540 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
34550 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
34560 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
34570 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
34580 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
34590 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
345a0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
345b0 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
345c0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
345d0 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
345e0 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
345f0 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
34600 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
34610 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
34620 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
34630 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
34640 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
34650 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
34660 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
34670 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
34680 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
34690 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
346a0 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
346b0 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
346c0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
346d0 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
346e0 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
346f0 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
34700 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
34710 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
34720 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
34730 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
34740 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
34750 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
34760 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
34770 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
34780 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
34790 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
347a0 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
347b0 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
347c0 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
347d0 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
347e0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
347f0 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
34800 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
34810 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
34820 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
34830 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
34840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34850 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
34860 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
34870 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
34880 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
34890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
348a0 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
348b0 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
348c0 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
348d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
348e0 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
348f0 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
34900 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
34910 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
34920 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
34930 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
34940 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
34950 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
34960 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
34970 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
34980 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
34990 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
349a0 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
349b0 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
349c0 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
349d0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
349e0 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
349f0 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e   the lowest scan
34a00 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   cost..        *
34a10 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
34a20 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
34a30 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
34a40 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
34a50 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
34a60 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
34a70 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74  13-10-03) Do not
34a80 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69   count the entri
34a90 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20  es in a partial 
34aa0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
34ab0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
34ac0 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
34ad0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
34ae0 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
34af0 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
34b00 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
34b10 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
34b20 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
34b30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
34b40 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
34b50 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74   ) pBest = sqlit
34b60 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
34b70 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
34b80 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
34b90 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
34ba0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
34bb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
34bc0 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
34bd0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
34be0 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
34bf0 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20  pTab->szTabRow. 
34c00 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
34c10 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
34c20 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
34c30 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
34c40 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73  x->szIdxRow<pBes
34c50 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20  t->szIdxRow).   
34c60 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
34c70 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
34c80 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
34c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34ca0 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
34cb0 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
34cc0 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
34cd0 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
34ce0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
34cf0 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
34d00 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
34d10 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
34d20 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
34d30 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
34d40 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
34d50 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
34d60 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
34d70 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
34d80 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
34d90 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
34da0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
34db0 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
34dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
34dd0 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
34de0 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
34df0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
34e00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34e10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34e20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
34e30 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
34e40 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
34e50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34e60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
34e70 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
34e80 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
34e90 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
34ea0 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
34eb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
34ec0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
34ed0 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
34ee0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
34ef0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
34f00 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
34f10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
34f20 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20  g forms:.       
34f30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
34f40 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
34f50 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
34f60 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
34f70 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
34f80 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
34f90 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
34fa0 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
34fb0 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
34fc0 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
34fd0 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lts.        ** a
34fe0 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
34ff0 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
35000 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
35010 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
35020 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
35030 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
35040 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
35050 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
35060 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  er, then.       
35070 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
35080 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
35090 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
350a0 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
350b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73  .        ** firs
350c0 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
350d0 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
350e0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
350f0 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  op is .        *
35100 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
35110 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
35120 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
35130 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
35140 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
35150 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
35160 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
35170 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
35180 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
35190 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
351a0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
351b0 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
351c0 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ghtly.        **
351d0 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72   modify behavior
351e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
351f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
35200 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
35210 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
35220 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
35230 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
35240 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
35250 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
35260 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
35270 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
35280 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
35290 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
352a0 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
352b0 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
352c0 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
352d0 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
352e0 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
352f0 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
35300 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
35310 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
35320 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
35330 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
35340 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
35350 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
35360 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
35370 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
35380 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
35390 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
353a0 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
353b0 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
353c0 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
353d0 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
353e0 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
353f0 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
35400 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
35410 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
35420 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20  NORMAL;.        
35430 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35440 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
35450 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
35460 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  t( flag==0 );.  
35470 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
35480 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ving==0 ){.     
35490 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d       flag = minM
354a0 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66  axQuery(&sAggInf
354b0 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20  o, &pMinMax);.  
354c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
354d0 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
354e0 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26  || (pMinMax!=0 &
354f0 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  & pMinMax->nExpr
35500 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ==1) );..       
35510 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
35520 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
35530 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
35540 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c  Dup(db, pMinMax,
35550 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
35560 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20  Del = pMinMax;. 
35570 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
35580 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
35590 64 20 7c 7c 20 70 4d 69 6e 4d 61 78 21 3d 30 20  d || pMinMax!=0 
355a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
355b0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
355c0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
355d0 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
355e0 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
355f0 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
35600 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
35610 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
35620 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
35630 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
35640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
35650 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
35660 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
35670 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
35680 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
35690 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
356a0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
356b0 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
356c0 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
356d0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
356e0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
356f0 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
35700 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
35710 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
35720 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
35730 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
35740 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
35750 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
35760 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d  List, pWhere, pM
35770 69 6e 4d 61 78 2c 20 30 2c 66 6c 61 67 2c 30 29  inMax, 0,flag,0)
35780 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57  ;.        if( pW
35790 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
357a0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
357b0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
357c0 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Del);.          
357d0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
357e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
357f0 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c     updateAccumul
35800 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41  ator(pParse, &sA
35810 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ggInfo);.       
35820 20 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78   assert( pMinMax
35830 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e  ==0 || pMinMax->
35840 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20  nExpr==1 );.    
35850 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
35860 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
35870 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20 20 20 20  Info)>0 ){.     
35880 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35890 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74 65 33 57  Goto(v, sqlite3W
358a0 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
358b0 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20  WInfo));.       
358c0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
358d0 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
358e0 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  x",.            
358f0 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45      (flag==WHERE
35900 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69  _ORDERBY_MIN?"mi
35910 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20  n":"max")));.   
35920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
35930 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
35940 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
35950 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
35960 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
35970 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d  ggInfo);.      }
35980 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f  ..      sSort.pO
35990 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
359a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
359b0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
359c0 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53  ving, addrEnd, S
359d0 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
359e0 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49  );.      selectI
359f0 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
35a00 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20   p, -1, 0, 0, . 
35a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
35a30 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
35a40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
35a50 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
35a60 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
35a70 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
35a80 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
35a90 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
35aa0 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
35ab0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
35ac0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
35ad0 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
35ae0 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
35af0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
35b00 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
35b10 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
35b20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
35b30 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
35b40 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
35b50 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
35b60 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
35b70 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
35b80 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
35b90 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
35ba0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
35bb0 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65  ){.    explainTe
35bc0 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a  mpTable(pParse,.
35bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35be0 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61       sSort.nOBSa
35bf0 74 3e 30 20 3f 20 22 52 49 47 48 54 20 50 41 52  t>0 ? "RIGHT PAR
35c00 54 20 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22  T OF ORDER BY":"
35c10 4f 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20  ORDER BY");.    
35c20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
35c30 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f  (pParse, p, &sSo
35c40 72 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rt, pEList->nExp
35c50 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
35c60 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
35c70 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
35c80 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
35c90 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
35ca0 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
35cb0 20 54 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   The SELECT has 
35cc0 62 65 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74  been coded. If t
35cd0 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72  here is an error
35ce0 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
35cf0 72 75 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65  ructure,.  ** se
35d00 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  t the return cod
35d10 65 20 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73  e to 1. Otherwis
35d20 65 20 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28  e 0. */.  rc = (
35d30 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b  pParse->nErr>0);
35d40 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a  ..  /* Control j
35d50 75 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20  umps to here if 
35d60 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
35d70 75 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f  untered above, o
35d80 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63  r upon.  ** succ
35d90 65 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66  essful coding of
35da0 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a   the SELECT..  *
35db0 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  /.select_end:.  
35dc0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
35dd0 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  r(pParse->iSelec
35de0 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c  tId, iRestoreSel
35df0 65 63 74 49 64 29 3b 0a 0a 20 20 73 71 6c 69 74  ectId);..  sqlit
35e00 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67  e3DbFree(db, sAg
35e10 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73  gInfo.aCol);.  s
35e20 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
35e30 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29   sAggInfo.aFunc)
35e40 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
35e50 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45  E_ENABLED.  SELE
35e60 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
35e70 2c 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73  ,p,("end process
35e80 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 70 50 61 72  ing\n"));.  pPar
35e90 73 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e  se->nSelectInden
35ea0 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  t--;.#endif.  re
35eb0 74 75 72 6e 20 72 63 3b 0a 7d 0a                 turn rc;.}.