/ Hex Artifact Content
Login

Artifact 73fa1cc03a325dd5f3e84bc6c4c975000028f96f85025ae2fe0b6eb0c30c2fe0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 0a 20  end(pParse, 0,. 
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50    sqlite3Expr(pP
1030: 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45  arse->db,TK_ASTE
1040: 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20  RISK,0));.  }.  
1050: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70  pNew->pEList = p
1060: 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f  EList;.  pNew->o
1070: 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20  p = TK_SELECT;. 
1080: 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20   pNew->selFlags 
1090: 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e  = selFlags;.  pN
10a0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->iLimit = 0;.
10b0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
10c0: 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  = 0;.#if SELECTT
10d0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70  RACE_ENABLED.  p
10e0: 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d  New->zSelName[0]
10f0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70   = 0;.#endif.  p
1100: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
1110: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
1120: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
1130: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
1140: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b  >nSelectRow = 0;
1150: 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29  .  if( pSrc==0 )
1160: 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44   pSrc = sqlite3D
1170: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
1180: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
1190: 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  pSrc));.  pNew->
11a0: 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 70  pSrc = pSrc;.  p
11b0: 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  New->pWhere = pW
11c0: 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  here;.  pNew->pG
11d0: 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
11e0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  y;.  pNew->pHavi
11f0: 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20  ng = pHaving;.  
1200: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
1210: 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 4e 65   pOrderBy;.  pNe
1220: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  w->pPrior = 0;. 
1230: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
1240: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
1250: 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65   = pLimit;.  pNe
1260: 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  w->pOffset = pOf
1270: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  fset;.  pNew->pW
1280: 69 74 68 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ith = 0;.  asser
1290: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
12a0: 20 70 4c 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50   pLimit!=0 || pP
12b0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 0a 20 20 20  arse->nErr>0.   
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d    || pParse->db-
12e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30  >mallocFailed!=0
12f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65   );.  if( pParse
1300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1310: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
1320: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64  Select(pParse->d
1330: 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26  b, pNew, pNew!=&
1340: 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e  standin);.    pN
1350: 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ew = 0;.  }else{
1360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
1370: 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50  w->pSrc!=0 || pP
1380: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a  arse->nErr>0 );.
1390: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
13a0: 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a  ew!=&standin );.
13b0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
13c0: 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
13d0: 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20  E_ENABLED./*.** 
13e0: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
13f0: 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a  a Select object.
1400: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1410: 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c  electSetName(Sel
1420: 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ect *p, const ch
1430: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
1440: 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a  ( p && zName ){.
1450: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1460: 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a  intf(sizeof(p->z
1470: 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65  SelName), p->zSe
1480: 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61  lName, "%s", zNa
1490: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  me);.  }.}.#endi
14a0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  f.../*.** Delete
14b0: 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63   the given Selec
14c0: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
14d0: 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74  all of its subst
14e0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
14f0: 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  d sqlite3SelectD
1500: 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1510: 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  b, Select *p){. 
1520: 20 69 66 28 20 70 20 29 20 63 6c 65 61 72 53 65   if( p ) clearSe
1530: 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a  lect(db, p, 1);.
1540: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1550: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1560: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
1570: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
1580: 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73  a compound..*/.s
1590: 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69  tatic Select *fi
15a0: 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65  ndRightmost(Sele
15b0: 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28  ct *p){.  while(
15c0: 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20   p->pNext ) p = 
15d0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75  p->pNext;.  retu
15e0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
15f0: 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e  iven 1 to 3 iden
1600: 74 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e  tifiers precedin
1610: 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f  g the JOIN keywo
1620: 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  rd, determine th
1630: 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69  e.** type of joi
1640: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
1650: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  teger constant t
1660: 68 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68  hat expresses th
1670: 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65  at type.** in te
1680: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  rms of the follo
1690: 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a  wing bit values:
16a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e  .**.**     JT_IN
16b0: 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52  NER.**     JT_CR
16c0: 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55  OSS.**     JT_OU
16d0: 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41  TER.**     JT_NA
16e0: 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f  TURAL.**     JT_
16f0: 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52  LEFT.**     JT_R
1700: 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c  IGHT.**.** A ful
1710: 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20  l outer join is 
1720: 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  the combination 
1730: 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a  of JT_LEFT and J
1740: 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49  T_RIGHT..**.** I
1750: 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20  f an illegal or 
1760: 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e  unsupported join
1770: 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74   type is seen, t
1780: 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e  hen still return
1790: 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c  .** a join type,
17a0: 20 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f   but put an erro
17b0: 72 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  r in the pParse 
17c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
17d0: 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  t sqlite3JoinTyp
17e0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
17f0: 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65   Token *pA, Toke
1800: 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43  n *pB, Token *pC
1810: 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70  ){.  int jointyp
1820: 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a  e = 0;.  Token *
1830: 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65  apAll[3];.  Toke
1840: 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20  n *p;.          
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37     /*   01234567
1870: 38 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33  89 123456789 123
1880: 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20  456789 123 */.  
1890: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
18a0: 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22  r zKeyText[] = "
18b0: 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69  naturaleftouteri
18c0: 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73  ghtfullinnercros
18d0: 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  s";.  static con
18e0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
18f0: 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20  u8 i;        /* 
1900: 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79  Beginning of key
1910: 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65  word text in zKe
1920: 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75  yText[] */.    u
1930: 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c  8 nChar;    /* L
1940: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79  ength of the key
1950: 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65  word in characte
1960: 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64  rs */.    u8 cod
1970: 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74  e;     /* Join t
1980: 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20  ype mask */.  } 
1990: 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20  aKeyword[] = {. 
19a0: 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f     /* natural */
19b0: 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54   { 0,  7, JT_NAT
19c0: 55 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20  URAL            
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65      },.    /* le
19e0: 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34  ft    */ { 6,  4
19f0: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54  , JT_LEFT|JT_OUT
1a00: 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ER          },. 
1a10: 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f     /* outer   */
1a20: 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54   { 10, 5, JT_OUT
1a30: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69      },.    /* ri
1a50: 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35  ght   */ { 14, 5
1a60: 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  , JT_RIGHT|JT_OU
1a70: 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TER         },. 
1a80: 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f     /* full    */
1a90: 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46   { 19, 4, JT_LEF
1aa0: 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55  T|JT_RIGHT|JT_OU
1ab0: 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e  TER },.    /* in
1ac0: 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35  ner   */ { 23, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20  , JT_INNER      
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1af0: 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f     /* cross   */
1b00: 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 28, 5, JT_INN
1b10: 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20  ER|JT_CROSS     
1b20: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e      },.  };.  in
1b30: 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b  t i, j;.  apAll[
1b40: 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c  0] = pA;.  apAll
1b50: 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c  [1] = pB;.  apAl
1b60: 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72  l[2] = pC;.  for
1b70: 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41  (i=0; i<3 && apA
1b80: 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll[i]; i++){.   
1b90: 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20   p = apAll[i];. 
1ba0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72     for(j=0; j<Ar
1bb0: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
1bc0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); j++){.      i
1bd0: 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72  f( p->n==aKeywor
1be0: 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20  d[j].nChar .    
1bf0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
1c00: 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29  StrNICmp((char*)
1c10: 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b  p->z, &zKeyText[
1c20: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20  aKeyword[j].i], 
1c30: 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  p->n)==0 ){.    
1c40: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20      jointype |= 
1c50: 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65  aKeyword[j].code
1c60: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c80: 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d     testcase( j==
1c90: 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d  0 || j==1 || j==
1ca0: 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d  2 || j==3 || j==
1cb0: 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d  4 || j==5 || j==
1cc0: 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d  6 );.    if( j>=
1cd0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1ce0: 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69  rd) ){.      joi
1cf0: 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f  ntype |= JT_ERRO
1d00: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1d10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a      }.  }.  if(.
1d20: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
1d30: 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55   (JT_INNER|JT_OU
1d40: 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52  TER))==(JT_INNER
1d50: 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20  |JT_OUTER) ||.  
1d60: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a     (jointype & J
1d70: 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b  T_ERROR)!=0.  ){
1d80: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d90: 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20  *zSp = " ";.    
1da0: 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b  assert( pB!=0 );
1db0: 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29  .    if( pC==0 )
1dc0: 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73  { zSp++; }.    s
1dd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1de0: 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20  Parse, "unknown 
1df0: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
1e00: 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20  oin type: ".    
1e10: 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20     "%T %T%s%T", 
1e20: 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29  pA, pB, zSp, pC)
1e30: 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d  ;.    jointype =
1e40: 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c   JT_INNER;.  }el
1e50: 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65  se if( (jointype
1e60: 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
1e70: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f  .         && (jo
1e80: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
1e90: 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54  T|JT_RIGHT))!=JT
1ea0: 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c  _LEFT ){.    sql
1eb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1ec0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47  rse, .      "RIG
1ed0: 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45  HT and FULL OUTE
1ee0: 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20  R JOINs are not 
1ef0: 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72  currently suppor
1f00: 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74  ted");.    joint
1f10: 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a  ype = JT_INNER;.
1f20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69    }.  return joi
1f30: 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ntype;.}../*.** 
1f40: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1f50: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   of a column in 
1f60: 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  a table.  Return
1f70: 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   -1 if the colum
1f80: 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74  n.** is not cont
1f90: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62  ained in the tab
1fa0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1fb0: 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61  t columnIndex(Ta
1fc0: 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74  ble *pTab, const
1fd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
1fe0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1ff0: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
2000: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
2010: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61  lite3StrICmp(pTa
2020: 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65  b->aCol[i].zName
2030: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
2040: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
2050: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
2060: 20 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73   Search the firs
2070: 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53  t N tables in pS
2080: 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  rc, from left to
2090: 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20   right, looking 
20a0: 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74  for a.** table t
20b0: 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e  hat has a column
20c0: 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a   named zCol.  .*
20d0: 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c  *.** When found,
20e0: 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20   set *piTab and 
20f0: 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61  *piCol to the ta
2100: 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f  ble index and co
2110: 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66  lumn index.** of
2120: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f   the matching co
2130: 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  lumn and return 
2140: 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  TRUE..**.** If n
2150: 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ot found, return
2160: 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69   FALSE..*/.stati
2170: 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f  c int tableAndCo
2180: 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63  lumnIndex(.  Src
2190: 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
21a0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61    /* Array of ta
21b0: 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a  bles to search *
21c0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
21d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21e0: 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
21f0: 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61  pSrc->a[] to sea
2200: 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rch */.  const c
2210: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
2220: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
2230: 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  umn we are looki
2240: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ng for */.  int 
2250: 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  *piTab,         
2260: 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20   /* Write index 
2270: 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72  of pSrc->a[] her
2280: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  e */.  int *piCo
2290: 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  l           /* W
22a0: 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53  rite index of pS
22b0: 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54  rc->a[*piTab].pT
22c0: 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20  ab->aCol[] here 
22d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
2300: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20   tables in pSrc 
2310: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
2320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2330: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74  ex of column mat
2340: 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20  ching zCol */.. 
2350: 20 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d   assert( (piTab=
2360: 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20  =0)==(piCol==0) 
2370: 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e  );  /* Both or n
2380: 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20  either are NULL 
2390: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
23a0: 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f  N; i++){.    iCo
23b0: 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  l = columnIndex(
23c0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c  pSrc->a[i].pTab,
23d0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   zCol);.    if( 
23e0: 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iCol>=0 ){.     
23f0: 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20   if( piTab ){.  
2400: 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69        *piTab = i
2410: 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c  ;.        *piCol
2420: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d   = iCol;.      }
2430: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2450: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2460: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2470: 20 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72   used to add ter
2480: 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f  ms implied by JO
2490: 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65  IN syntax to the
24a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
24b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61   expression of a
24c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24d0: 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c  t. The new term,
24e0: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44   which.** is AND
24f0: 65 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73  ed with the exis
2500: 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73  ting WHERE claus
2510: 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  e, is of the for
2520: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62  m:.**.**    (tab
2530: 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f  1.col1 = tab2.co
2540: 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  l2).**.** where 
2550: 74 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63  tab1 is the iSrc
2560: 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63  'th table in Src
2570: 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61  List pSrc and ta
2580: 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69  b2 is the .** (i
2590: 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d  Src+1)'th. Colum
25a0: 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e  n col1 is column
25b0: 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62   iColLeft of tab
25c0: 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a  1, and col2 is.*
25d0: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67  * column iColRig
25e0: 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73  ht of tab2..*/.s
25f0: 74 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68  tatic void addWh
2600: 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ereTerm(.  Parse
2610: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2630: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
2640: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2660: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
2670: 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61  bles in FROM cla
2680: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  use */.  int iLe
2690: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26b0: 78 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65  x of first table
26c0: 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63   to join in pSrc
26d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65   */.  int iColLe
26e0: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
26f0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2700: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73  f column in firs
2710: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
2720: 20 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20   iRight,        
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2740: 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20  Index of second 
2750: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f  table in pSrc */
2760: 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74  .  int iColRight
2770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2780: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
2790: 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20  olumn in second 
27a0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
27b0: 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20  sOuterJoin,     
27c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27d0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
27e0: 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20   OUTER join */. 
27f0: 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20   Expr **ppWhere 
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20   /* IN/OUT: The 
2820: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
2830: 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  add to */.){.  s
2840: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2850: 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
2860: 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE1;.  Expr *pE
2870: 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a  2;.  Expr *pEq;.
2880: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74  .  assert( iLeft
2890: 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73  <iRight );.  ass
28a0: 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e  ert( pSrc->nSrc>
28b0: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
28c0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66  rt( pSrc->a[iLef
28d0: 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73  t].pTab );.  ass
28e0: 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69  ert( pSrc->a[iRi
28f0: 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20  ght].pTab );..  
2900: 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE1 = sqlite3Cre
2910: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
2930: 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20  ColLeft);.  pE2 
2940: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
2950: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
2960: 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c  rc, iRight, iCol
2970: 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d  Right);..  pEq =
2980: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2990: 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31  arse, TK_EQ, pE1
29a0: 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45  , pE2);.  if( pE
29b0: 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e  q && isOuterJoin
29c0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
29d0: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
29e0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
29f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
2a20: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
2a30: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
2a40: 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  pEq, EP_NoReduce
2a50: 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67  );.    pEq->iRig
2a60: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69  htJoinTable = (i
2a70: 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a  16)pE2->iTable;.
2a80: 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d    }.  *ppWhere =
2a90: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2aa0: 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45  db, *ppWhere, pE
2ab0: 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  q);.}../*.** Set
2ac0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
2ad0: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c   property on all
2ae0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69   terms of the gi
2af0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
2b00: 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45  ** And set the E
2b10: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
2b20: 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f  ble to iTable fo
2b30: 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  r every term in 
2b40: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
2b50: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f  n..**.** The EP_
2b60: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2b70: 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72  y is used on ter
2b80: 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  ms of an express
2b90: 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74  ion to tell.** t
2ba0: 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  he LEFT OUTER JO
2bb0: 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  IN processing lo
2bc0: 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65  gic that this te
2bd0: 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  rm is part of th
2be0: 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69  e.** join restri
2bf0: 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20  ction specified 
2c00: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2c10: 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f  NG clause and no
2c20: 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  t a part.** of t
2c30: 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20  he more general 
2c40: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54  WHERE clause.  T
2c50: 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d  hese terms are m
2c60: 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65  oved over to the
2c70: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
2c80: 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f   during join pro
2c90: 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e  cessing but we n
2ca0: 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
2cb0: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69  that they.** ori
2cc0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
2cd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2ce0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  e..**.** The Exp
2cf0: 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  r.iRightJoinTabl
2d00: 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52  e tells the WHER
2d10: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
2d20: 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ing that the.** 
2d30: 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e  expression depen
2d40: 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67  ds on table iRig
2d50: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e  htJoinTable even
2d60: 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69   if that table i
2d70: 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69  s not.** explici
2d80: 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e  tly mentioned in
2d90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
2da0: 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69    That informati
2db0: 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20  on is needed.** 
2dc0: 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74  for cases like t
2dd0: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  his:.**.**    SE
2de0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
2df0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
2e00: 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e  1.a=t2.b AND t1.
2e10: 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68  x=5.**.** The wh
2e20: 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73  ere clause needs
2e30: 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61   to defer the ha
2e40: 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31  ndling of the t1
2e50: 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74  .x=5.** term unt
2e60: 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20  il after the t2 
2e70: 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e  loop of the join
2e80: 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  .  In that way, 
2e90: 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77  a.** NULL t2 row
2ea0: 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2eb0: 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21  d whenever t1.x!
2ec0: 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f  =5.  If we do no
2ed0: 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68  t.** defer the h
2ee0: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d  andling of t1.x=
2ef0: 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72  5, it will be pr
2f00: 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74  ocessed immediat
2f10: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65  ely.** after the
2f20: 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77   t1 loop and row
2f30: 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77  s with t1.x!=5 w
2f40: 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72  ill never appear
2f50: 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75   in.** the outpu
2f60: 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f  t, which is inco
2f70: 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
2f80: 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70   void setJoinExp
2f90: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69  r(Expr *p, int i
2fa0: 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28  Table){.  while(
2fb0: 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65   p ){.    ExprSe
2fc0: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
2fd0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61  FromJoin);.    a
2fe0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2ff0: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f  roperty(p, EP_To
3000: 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63  kenOnly|EP_Reduc
3010: 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53  ed) );.    ExprS
3020: 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c  etVVAProperty(p,
3030: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
3040: 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e     p->iRightJoin
3050: 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61  Table = (i16)iTa
3060: 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ble;.    if( p->
3070: 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op==TK_FUNCTION 
3080: 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b  && p->x.pList ){
3090: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
30a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
30b0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
30c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
30d0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78  setJoinExpr(p->x
30e0: 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  .pList->a[i].pEx
30f0: 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  pr, iTable);.   
3100: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
3110: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c  etJoinExpr(p->pL
3120: 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  eft, iTable);.  
3130: 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b    p = p->pRight;
3140: 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  .  } .}../*.** T
3150: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f 63  his routine proc
3160: 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20 69  esses the join i
3170: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
3180: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3190: 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53 49  t..** ON and USI
31a0: 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 63  NG clauses are c
31b0: 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65 78  onverted into ex
31c0: 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68 65  tra terms of the
31d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a   WHERE clause..*
31e0: 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73 20  * NATURAL joins 
31f0: 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74 72  also create extr
3200: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
3210: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  erms..**.** The 
3220: 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d 20  terms of a FROM 
3230: 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74 61  clause are conta
3240: 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c 65  ined in the Sele
3250: 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75 72  ct.pSrc structur
3260: 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20 6d  e..** The left m
3270: 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68 65  ost table is the
3280: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
3290: 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54 68  Select.pSrc.  Th
32a0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20  e right-most.** 
32b0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61 73  table is the las
32c0: 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a 6f  t entry.  The jo
32d0: 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 68  in operator is h
32e0: 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72 79  eld in the entry
32f0: 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74 2e   to.** the left.
3300: 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20 63    Thus entry 0 c
3310: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69 6e  ontains the join
3320: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74 68   operator for th
3330: 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a 2a  e join between.*
3340: 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64 20  * entries 0 and 
3350: 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55 53  1.  Any ON or US
3360: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73 6f  ING clauses asso
3370: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
3380: 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73 6f  join are.** also
3390: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
33a0: 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a   left entry..**.
33b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33c0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
33d0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63  er of errors enc
33e0: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74 61  ountered..*/.sta
33f0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50 72  tic int sqlitePr
3400: 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65 20  ocessJoin(Parse 
3410: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
3420: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
3430: 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  pSrc;           
3440: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74 61         /* All ta
3450: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
3460: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
3470: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
3480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3490: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
34a0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34b0: 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20 20  t_item *pLeft;  
34c0: 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c 65     /* Left table
34d0: 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f   being joined */
34e0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
34f0: 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b 20  t_item *pRight; 
3500: 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62 6c     /* Right tabl
3510: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
3520: 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  /..  pSrc = p->p
3530: 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20 26  Src;.  pLeft = &
3540: 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52  pSrc->a[0];.  pR
3550: 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31 5d  ight = &pLeft[1]
3560: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3570: 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b  Src->nSrc-1; i++
3580: 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65 66  , pRight++, pLef
3590: 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  t++){.    Table 
35a0: 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65 66  *pLeftTab = pLef
35b0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61 62  t->pTab;.    Tab
35c0: 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d 20  le *pRightTab = 
35d0: 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20 20  pRight->pTab;.  
35e0: 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a 0a    int isOuter;..
35f0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 4c      if( NEVER(pL
3600: 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52 69  eftTab==0 || pRi
3610: 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f 6e  ghtTab==0) ) con
3620: 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75 74  tinue;.    isOut
3630: 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 66 67  er = (pRight->fg
3640: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f  .jointype & JT_O
3650: 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  UTER)!=0;..    /
3660: 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52  * When the NATUR
3670: 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  AL keyword is pr
3680: 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45  esent, add WHERE
3690: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f   clause terms fo
36a0: 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63  r.    ** every c
36b0: 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74  olumn that the t
36c0: 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  wo tables have i
36d0: 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f  n common..    */
36e0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
36f0: 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
3700: 54 5f 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20  T_NATURAL ){.   
3710: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3720: 4f 6e 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55  On || pRight->pU
3730: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20  sing ){.        
3740: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3750: 70 50 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52  pParse, "a NATUR
3760: 41 4c 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20  AL join may not 
3770: 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 20  have ".         
3780: 20 20 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e    "an ON or USIN
3790: 47 20 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20  G clause", 0);. 
37a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
37b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
37c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 52 69 67 68 74  or(j=0; j<pRight
37d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
37e0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
37f0: 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
3800: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  of column in the
3810: 20 72 69 67 68 74 20 74 61 62 6c 65 20 2a 2f 0a   right table */.
3820: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3830: 74 3b 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 69  t;     /* Matchi
3840: 6e 67 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f  ng left table */
3850: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65  .        int iLe
3860: 66 74 43 6f 6c 3b 20 20 2f 2a 20 4d 61 74 63 68  ftCol;  /* Match
3870: 69 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  ing column in th
3880: 65 20 6c 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a  e left table */.
3890: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
38a0: 20 70 52 69 67 68 74 54 61 62 2d 3e 61 43 6f 6c   pRightTab->aCol
38b0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
38c0: 20 20 20 69 66 28 20 74 61 62 6c 65 41 6e 64 43     if( tableAndC
38d0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c  olumnIndex(pSrc,
38e0: 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c   i+1, zName, &iL
38f0: 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c 29 20  eft, &iLeftCol) 
3900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64  ){.          add
3910: 57 68 65 72 65 54 65 72 6d 28 70 50 61 72 73 65  WhereTerm(pParse
3920: 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69  , pSrc, iLeft, i
3930: 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c  LeftCol, i+1, j,
3940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3950: 20 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c          isOuter,
3960: 20 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20   &p->pWhere);.  
3970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3980: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
3990: 73 61 6c 6c 6f 77 20 62 6f 74 68 20 4f 4e 20 61  sallow both ON a
39a0: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
39b0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f 69   in the same joi
39c0: 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
39d0: 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 26 26 20   pRight->pOn && 
39e0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
39f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3a00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3a10: 22 63 61 6e 6e 6f 74 20 68 61 76 65 20 62 6f 74  "cannot have bot
3a20: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 22  h ON and USING "
3a30: 0a 20 20 20 20 20 20 20 20 22 63 6c 61 75 73 65  .        "clause
3a40: 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6a 6f  s in the same jo
3a50: 69 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  in");.      retu
3a60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 1;.    }..   
3a70: 20 2f 2a 20 41 64 64 20 74 68 65 20 4f 4e 20 63   /* Add the ON c
3a80: 6c 61 75 73 65 20 74 6f 20 74 68 65 20 65 6e 64  lause to the end
3a90: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
3aa0: 61 75 73 65 2c 20 63 6f 6e 6e 65 63 74 65 64 20  ause, connected 
3ab0: 62 79 0a 20 20 20 20 2a 2a 20 61 6e 20 41 4e 44  by.    ** an AND
3ac0: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
3ad0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3ae0: 2d 3e 70 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  ->pOn ){.      i
3af0: 66 28 20 69 73 4f 75 74 65 72 20 29 20 73 65 74  f( isOuter ) set
3b00: 4a 6f 69 6e 45 78 70 72 28 70 52 69 67 68 74 2d  JoinExpr(pRight-
3b10: 3e 70 4f 6e 2c 20 70 52 69 67 68 74 2d 3e 69 43  >pOn, pRight->iC
3b20: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 70 2d  ursor);.      p-
3b30: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
3b40: 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
3b50: 3e 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20  >db, p->pWhere, 
3b60: 70 52 69 67 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20  pRight->pOn);.  
3b70: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20      pRight->pOn 
3b80: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
3b90: 2f 2a 20 43 72 65 61 74 65 20 65 78 74 72 61 20  /* Create extra 
3ba0: 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 57 48 45  terms on the WHE
3bb0: 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 65 61  RE clause for ea
3bc0: 63 68 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a  ch column named.
3bd0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 55 53      ** in the US
3be0: 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 45 78 61  ING clause.  Exa
3bf0: 6d 70 6c 65 3a 20 49 66 20 74 68 65 20 74 77 6f  mple: If the two
3c00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3c10: 69 6e 65 64 20 61 72 65 20 0a 20 20 20 20 2a 2a  ined are .    **
3c20: 20 41 20 61 6e 64 20 42 20 61 6e 64 20 74 68 65   A and B and the
3c30: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6e 61   USING clause na
3c40: 6d 65 73 20 58 2c 20 59 2c 20 61 6e 64 20 5a 2c  mes X, Y, and Z,
3c50: 20 74 68 65 6e 20 61 64 64 20 74 68 69 73 0a 20   then add this. 
3c60: 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 57 48 45     ** to the WHE
3c70: 52 45 20 63 6c 61 75 73 65 3a 20 20 20 20 41 2e  RE clause:    A.
3c80: 58 3d 42 2e 58 20 41 4e 44 20 41 2e 59 3d 42 2e  X=B.X AND A.Y=B.
3c90: 59 20 41 4e 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20  Y AND A.Z=B.Z.  
3ca0: 20 20 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65    ** Report an e
3cb0: 72 72 6f 72 20 69 66 20 61 6e 79 20 63 6f 6c 75  rror if any colu
3cc0: 6d 6e 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  mn mentioned in 
3cd0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3ce0: 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 63   is.    ** not c
3cf0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 62 6f 74 68  ontained in both
3d00: 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 6a 6f   tables to be jo
3d10: 69 6e 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ined..    */.   
3d20: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 55 73   if( pRight->pUs
3d30: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 49 64 4c  ing ){.      IdL
3d40: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 52 69  ist *pList = pRi
3d50: 67 68 74 2d 3e 70 55 73 69 6e 67 3b 0a 20 20 20  ght->pUsing;.   
3d60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
3d70: 69 73 74 2d 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a  ist->nId; j++){.
3d80: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
3d90: 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
3da0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 69 6e 20   of the term in 
3db0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
3dc0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3dd0: 69 4c 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20  iLeft;       /* 
3de0: 54 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 65 66  Table on the lef
3df0: 74 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  t with matching 
3e00: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
3e10: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3e20: 43 6f 6c 3b 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col;    /* Colum
3e30: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  n number of matc
3e40: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74  hing column on t
3e50: 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 20  he left */.     
3e60: 20 20 20 69 6e 74 20 69 52 69 67 68 74 43 6f 6c     int iRightCol
3e70: 3b 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75  ;   /* Column nu
3e80: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3e90: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 72   column on the r
3ea0: 69 67 68 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  ight */..       
3eb0: 20 7a 4e 61 6d 65 20 3d 20 70 4c 69 73 74 2d 3e   zName = pList->
3ec0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3ed0: 20 20 20 20 69 52 69 67 68 74 43 6f 6c 20 3d 20      iRightCol = 
3ee0: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67  columnIndex(pRig
3ef0: 68 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  htTab, zName);. 
3f00: 20 20 20 20 20 20 20 69 66 28 20 69 52 69 67 68         if( iRigh
3f10: 74 43 6f 6c 3c 30 0a 20 20 20 20 20 20 20 20 20  tCol<0.         
3f20: 7c 7c 20 21 74 61 62 6c 65 41 6e 64 43 6f 6c 75  || !tableAndColu
3f30: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b  mnIndex(pSrc, i+
3f40: 31 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74  1, zName, &iLeft
3f50: 2c 20 26 69 4c 65 66 74 43 6f 6c 29 0a 20 20 20  , &iLeftCol).   
3f60: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
3f70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3f80: 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f  g(pParse, "canno
3f90: 74 20 6a 6f 69 6e 20 75 73 69 6e 67 20 63 6f 6c  t join using col
3fa0: 75 6d 6e 20 25 73 20 2d 20 63 6f 6c 75 6d 6e 20  umn %s - column 
3fb0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 6e  ".            "n
3fc0: 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 62 6f  ot present in bo
3fd0: 74 68 20 74 61 62 6c 65 73 22 2c 20 7a 4e 61 6d  th tables", zNam
3fe0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
3ff0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
4000: 7d 0a 20 20 20 20 20 20 20 20 61 64 64 57 68 65  }.        addWhe
4010: 72 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  reTerm(pParse, p
4020: 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66  Src, iLeft, iLef
4030: 74 43 6f 6c 2c 20 69 2b 31 2c 20 69 52 69 67 68  tCol, i+1, iRigh
4040: 74 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tCol,.          
4050: 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 75 74             isOut
4060: 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 29 3b  er, &p->pWhere);
4070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4090: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
40a0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
40b0: 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66   KeyInfo *keyInf
40c0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
40d0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
40e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
40f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
4100: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
4110: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
4120: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
4130: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
4140: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
4150: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
4160: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
4170: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
4180: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
4190: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
41a0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
41b0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
41c0: 64 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47  d */.);../*.** G
41d0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
41e0: 74 20 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20  t will push the 
41f0: 72 65 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74  record in regist
4200: 65 72 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74  ers regData.** t
4210: 68 72 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e  hrough regData+n
4220: 44 61 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20  Data-1 onto the 
4230: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
4240: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
4250: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
4260: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4270: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
4280: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
4290: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a  pSort,        /*
42a0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
42b0: 75 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ut the ORDER BY 
42c0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
42d0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
42e0: 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
42f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4300: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74   */.  int regDat
4310: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
4320: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4330: 6f 6c 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62  olding data to b
4340: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e  e sorted */.  in
4350: 74 20 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20  t regOrigData,  
4360: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
4370: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4380: 61 74 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69  ata before packi
4390: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74  ng */.  int nDat
43a0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a,             /
43b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
43c0: 65 6e 74 73 20 69 6e 20 74 68 65 20 64 61 74 61  ents in the data
43d0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
43e0: 6e 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20  nPrefixReg      
43f0: 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67     /* No. of reg
4400: 20 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74   prior to regDat
4410: 61 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  a available for 
4420: 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  use */.){.  Vdbe
4430: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4440: 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  dbe;            
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4460: 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  Stmt under const
4470: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
4480: 20 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d   bSeq = ((pSort-
4490: 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52  >sortFlags & SOR
44a0: 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29  TFLAG_UseSorter)
44b0: 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ==0);.  int nExp
44c0: 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  r = pSort->pOrde
44d0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20  rBy->nExpr;     
44e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
44f0: 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  of ORDER BY term
4500: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65  s */.  int nBase
4510: 20 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20   = nExpr + bSeq 
4520: 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20  + nData;        
4530: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64          /* Field
4540: 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f  s in sorter reco
4550: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  rd */.  int regB
4560: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73           /* Regs
4590: 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f   for sorter reco
45a0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52  rd */.  int regR
45b0: 65 63 6f 72 64 20 3d 20 2b 2b 70 50 61 72 73 65  ecord = ++pParse
45c0: 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
45d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65           /* Asse
45e0: 6d 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63  mbled sorter rec
45f0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42  ord */.  int nOB
4600: 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42  Sat = pSort->nOB
4610: 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sat;            
4620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44            /* ORD
4630: 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73  ER BY terms to s
4640: 6b 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  kip */.  int op;
4650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
4670: 70 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72  pcode to add sor
4680: 74 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f  ter record to so
4690: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rter */.  int iL
46a0: 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
46c0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f  LIMIT counter */
46d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71  ..  assert( bSeq
46e0: 3d 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29  ==0 || bSeq==1 )
46f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74  ;.  assert( nDat
4700: 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d  a==1 || regData=
4710: 3d 72 65 67 4f 72 69 67 44 61 74 61 20 7c 7c 20  =regOrigData || 
4720: 72 65 67 4f 72 69 67 44 61 74 61 3d 3d 30 20 29  regOrigData==0 )
4730: 3b 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  ;.  if( nPrefixR
4740: 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  eg ){.    assert
4750: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45  ( nPrefixReg==nE
4760: 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20  xpr+bSeq );.    
4770: 72 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74  regBase = regDat
4780: 61 20 2d 20 6e 45 78 70 72 20 2d 20 62 53 65 71  a - nExpr - bSeq
4790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
47a0: 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d  egBase = pParse-
47b0: 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70  >nMem + 1;.    p
47c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
47d0: 42 61 73 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Base;.  }.  asse
47e0: 72 74 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  rt( pSelect->iOf
47f0: 66 73 65 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65  fset==0 || pSele
4800: 63 74 2d 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b  ct->iLimit!=0 );
4810: 0a 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c  .  iLimit = pSel
4820: 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  ect->iOffset ? p
4830: 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b  Select->iOffset+
4840: 31 20 3a 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  1 : pSelect->iLi
4850: 6d 69 74 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61  mit;.  pSort->la
4860: 62 65 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65  belDone = sqlite
4870: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
4880: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4890: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
48a0: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64  rse, pSort->pOrd
48b0: 65 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 72  erBy, regBase, r
48c0: 65 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20 20  egOrigData,.    
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48e0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45        SQLITE_ECE
48f0: 4c 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69 67  L_DUP | (regOrig
4900: 44 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43 45  Data? SQLITE_ECE
4910: 4c 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20 69  L_REF : 0));.  i
4920: 66 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73  f( bSeq ){.    s
4930: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4940: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
4950: 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72   pSort->iECursor
4960: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
4970: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65  ;.  }.  if( nPre
4980: 66 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44 61  fixReg==0 && nDa
4990: 74 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ta>0 ){.    sqli
49a0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
49b0: 70 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c  pParse, regData,
49c0: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 62   regBase+nExpr+b
49d0: 53 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d  Seq, nData);.  }
49e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
49f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4a00: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e  ecord, regBase+n
4a10: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
4a20: 53 61 74 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Sat, regRecord);
4a30: 0a 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20  .  if( nOBSat>0 
4a40: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72  ){.    int regPr
4a50: 65 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20  evKey;   /* The 
4a60: 66 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c  first nOBSat col
4a70: 75 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76  umns of the prev
4a80: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
4a90: 69 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20  int addrFirst;  
4aa0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
4ab0: 74 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63  the OP_IfNot opc
4ac0: 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ode */.    int a
4ad0: 64 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20  ddrJmp;      /* 
4ae0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f  Address of the O
4af0: 50 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f  P_Jump opcode */
4b00: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
4b10: 3b 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65  ;      /* Opcode
4b20: 20 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20   that opens the 
4b30: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
4b40: 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  t nKey;         
4b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72  /* Number of sor
4b60: 74 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  ting key columns
4b70: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53  , including OP_S
4b80: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b  equence */.    K
4b90: 65 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20  eyInfo *pKI;    
4ba0: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79   /* Original Key
4bb0: 49 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74  Info on the sort
4bc0: 65 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  er table */..   
4bd0: 20 72 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50   regPrevKey = pP
4be0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
4bf0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4c00: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
4c10: 0a 20 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70  .    nKey = nExp
4c20: 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r - pSort->nOBSa
4c30: 74 20 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66  t + bSeq;.    if
4c40: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ( bSeq ){.      
4c50: 61 64 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69  addrFirst = sqli
4c60: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
4c70: 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61   OP_IfNot, regBa
4c80: 73 65 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20  se+nExpr); .    
4c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
4ca0: 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
4cb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
4cc0: 5f 53 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70  _SequenceTest, p
4cd0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43  .    }.    VdbeC
4cf0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4d00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4d10: 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  3(v, OP_Compare,
4d20: 20 72 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67   regPrevKey, reg
4d30: 42 61 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42  Base, pSort->nOB
4d40: 53 61 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20  Sat);.    pOp = 
4d50: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
4d60: 28 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53  (v, pSort->addrS
4d70: 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  ortIndex);.    i
4d80: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
4d90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
4da0: 74 75 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  turn;.    pOp->p
4db0: 32 20 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61  2 = nKey + nData
4dc0: 3b 0a 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d  ;.    pKI = pOp-
4dd0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
4de0: 20 20 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53    memset(pKI->aS
4df0: 6f 72 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49  ortOrder, 0, pKI
4e00: 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a  ->nKeyField); /*
4e10: 20 4d 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74   Makes OP_Jump t
4e20: 65 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  estable */.    s
4e30: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4e40: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a  P4(v, -1, (char*
4e50: 29 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  )pKI, P4_KEYINFO
4e60: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
4e70: 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20   pKI->nAllField 
4e80: 3e 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64  > pKI->nKeyField
4e90: 2b 32 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  +2 );.    pOp->p
4ea0: 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79  4.pKeyInfo = key
4eb0: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
4ec0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
4ed0: 70 4f 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74  pOrderBy, nOBSat
4ee0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4b 49               pKI
4f10: 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d  ->nAllField-pKI-
4f20: 3e 6e 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20  >nKeyField-1);. 
4f30: 20 20 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c     addrJmp = sql
4f40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4f50: 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  ddr(v);.    sqli
4f60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4f70: 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d   OP_Jump, addrJm
4f80: 70 2b 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b  p+1, 0, addrJmp+
4f90: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
4fa0: 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e  (v);.    pSort->
4fb0: 6c 61 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c  labelBkOut = sql
4fc0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
4fd0: 6c 28 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d  l(v);.    pSort-
4fe0: 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
4ff0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5000: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5010: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
5020: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
5030: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
5040: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
5050: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5060: 50 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70  P_ResetSorter, p
5070: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b  Sort->iECursor);
5080: 0a 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20  .    if( iLimit 
5090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
50a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
50b0: 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
50c0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65  pSort->labelDone
50d0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
50e0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
50f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5100: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 46  umpHere(v, addrF
5110: 69 72 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  irst);.    sqlit
5120: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
5130: 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
5140: 72 65 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72  regPrevKey, pSor
5150: 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20  t->nOBSat);.    
5160: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5170: 65 72 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b  ere(v, addrJmp);
5180: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
5190: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
51a0: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
51b0: 20 29 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f   ){.    op = OP_
51c0: 53 6f 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20  SorterInsert;.  
51d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20  }else{.    op = 
51e0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20  OP_IdxInsert;.  
51f0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
5200: 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20  ddOp4Int(v, op, 
5210: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
5220: 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61     regBase+nOBSa
5250: 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29  t, nBase-nOBSat)
5260: 3b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29  ;.  if( iLimit )
5270: 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a  {.    int addr;.
5280: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 30 3b 0a      int r1 = 0;.
5290: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20      /* Fill the 
52a0: 73 6f 72 74 65 72 20 75 6e 74 69 6c 20 69 74 20  sorter until it 
52b0: 63 6f 6e 74 61 69 6e 73 20 4c 49 4d 49 54 2b 4f  contains LIMIT+O
52c0: 46 46 53 45 54 20 65 6e 74 72 69 65 73 2e 20 20  FFSET entries.  
52d0: 28 54 68 65 20 69 4c 69 6d 69 74 0a 20 20 20 20  (The iLimit.    
52e0: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 73 20 69  ** register is i
52f0: 6e 69 74 69 61 6c 69 7a 65 64 20 77 69 74 68 20  nitialized with 
5300: 76 61 6c 75 65 20 6f 66 20 4c 49 4d 49 54 2b 4f  value of LIMIT+O
5310: 46 46 53 45 54 2e 29 20 20 41 66 74 65 72 20 74  FFSET.)  After t
5320: 68 65 20 73 6f 72 74 65 72 0a 20 20 20 20 2a 2a  he sorter.    **
5330: 20 66 69 6c 6c 73 20 75 70 2c 20 64 65 6c 65 74   fills up, delet
5340: 65 20 74 68 65 20 6c 65 61 73 74 20 65 6e 74 72  e the least entr
5350: 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20  y in the sorter 
5360: 61 66 74 65 72 20 65 61 63 68 20 69 6e 73 65 72  after each inser
5370: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 75 73 20 77  t..    ** Thus w
5380: 65 20 6e 65 76 65 72 20 68 6f 6c 64 20 6d 6f 72  e never hold mor
5390: 65 20 74 68 61 6e 20 74 68 65 20 4c 49 4d 49 54  e than the LIMIT
53a0: 2b 4f 46 46 53 45 54 20 72 6f 77 73 20 69 6e 20  +OFFSET rows in 
53b0: 6d 65 6d 6f 72 79 20 61 74 20 6f 6e 63 65 20 2a  memory at once *
53c0: 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c  /.    addr = sql
53d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
53e0: 2c 20 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20  , OP_IfNotZero, 
53f0: 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
5400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
5420: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 53 6f 72  v, OP_Last, pSor
5430: 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  t->iECursor);.  
5440: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72    if( pSort->bOr
5450: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29  deredInnerLoop )
5460: 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 2b 2b 70  {.      r1 = ++p
5470: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
5480: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5490: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
54a0: 6e 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  n, pSort->iECurs
54b0: 6f 72 2c 20 6e 45 78 70 72 2c 20 72 31 29 3b 0a  or, nExpr, r1);.
54c0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
54d0: 74 28 28 76 2c 20 22 73 65 71 22 29 29 3b 0a 20  t((v, "seq"));. 
54e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
54f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5500: 5f 44 65 6c 65 74 65 2c 20 70 53 6f 72 74 2d 3e  _Delete, pSort->
5510: 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69  iECursor);.    i
5520: 66 28 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72  f( pSort->bOrder
5530: 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20  edInnerLoop ){. 
5540: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
5550: 6e 6e 65 72 20 6c 6f 6f 70 20 69 73 20 64 72 69  nner loop is dri
5560: 76 65 6e 20 62 79 20 61 6e 20 69 6e 64 65 78 20  ven by an index 
5570: 73 75 63 68 20 74 68 61 74 20 76 61 6c 75 65 73  such that values
5580: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 74   from.      ** t
5590: 68 65 20 73 61 6d 65 20 69 74 65 72 61 74 69 6f  he same iteratio
55a0: 6e 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  n of the inner l
55b0: 6f 6f 70 20 61 72 65 20 69 6e 20 73 6f 72 74 65  oop are in sorte
55c0: 64 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20  d order, then.  
55d0: 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65      ** immediate
55e0: 6c 79 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  ly jump to the n
55f0: 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
5600: 20 61 6e 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69   an inner loop i
5610: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  f the.      ** e
5620: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 63 75  ntry from the cu
5630: 72 72 65 6e 74 20 69 74 65 72 61 74 69 6f 6e 20  rrent iteration 
5640: 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 69 6e 74  does not fit int
5650: 6f 20 74 68 65 20 74 6f 70 0a 20 20 20 20 20 20  o the top.      
5660: 2a 2a 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  ** LIMIT+OFFSET 
5670: 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73  entries of the s
5680: 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  orter. */.      
5690: 69 6e 74 20 69 42 72 6b 20 3d 20 73 71 6c 69 74  int iBrk = sqlit
56a0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
56b0: 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20  r(v) + 2;.      
56c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
56d0: 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 42  3(v, OP_Eq, regB
56e0: 61 73 65 2b 6e 45 78 70 72 2c 20 69 42 72 6b 2c  ase+nExpr, iBrk,
56f0: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
5700: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5710: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
5720: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
5730: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
5740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
5750: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29  umpHere(v, addr)
5760: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
5770: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
5780: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
5790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
57a0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
57b0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
57c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
57d0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
57e0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
57f0: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
5800: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
5810: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
5820: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
5830: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
5840: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
5850: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
5860: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
5870: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
5880: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
5890: 66 50 6f 73 2c 20 69 4f 66 66 73 65 74 2c 20 69  fPos, iOffset, i
58a0: 43 6f 6e 74 69 6e 75 65 2c 20 31 29 3b 20 56 64  Continue, 1); Vd
58b0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
58c0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
58d0: 76 2c 20 22 4f 46 46 53 45 54 22 29 29 3b 0a 20  v, "OFFSET"));. 
58e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
58f0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 63  code that will c
5900: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5910: 65 20 74 68 65 20 4e 20 72 65 67 69 73 74 65 72  e the N register
5920: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 69 4d  s starting at iM
5930: 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64 69 73  em.** form a dis
5940: 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20 69 54  tinct entry.  iT
5950: 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e 67 20  ab is a sorting 
5960: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
5970: 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 73   previously.** s
5980: 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  een combinations
5990: 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75 65 73   of the N values
59a0: 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
59b0: 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62 0a 2a  s made in iTab.*
59c0: 2a 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  * if the current
59d0: 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65   N values are ne
59e0: 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d 70 20  w..**.** A jump 
59f0: 74 6f 20 61 64 64 72 52 65 70 65 61 74 20 69 73  to addrRepeat is
5a00: 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20 4e 2b   made and the N+
5a10: 31 20 76 61 6c 75 65 73 20 61 72 65 20 70 6f 70  1 values are pop
5a20: 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ped from the.** 
5a30: 73 74 61 63 6b 20 69 66 20 74 68 65 20 74 6f 70  stack if the top
5a40: 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20   N elements are 
5a50: 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a 2a 2f  not distinct..*/
5a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
5a70: 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50 61 72  eDistinct(.  Par
5a80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5a90: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5aa0: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5ab0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
5ac0: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
5ad0: 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  * A sorting inde
5ae0: 78 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 66  x used to test f
5af0: 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73 73 20  or distinctness 
5b00: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52 65 70  */.  int addrRep
5b10: 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d 70 20  eat,    /* Jump 
5b20: 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74 20 64  to here if not d
5b30: 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69 6e 74  istinct */.  int
5b40: 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
5b50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
5b60: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
5b70: 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem           /*
5b80: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 2a   First element *
5b90: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  /.){.  Vdbe *v;.
5ba0: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76 20 3d    int r1;..  v =
5bb0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
5bc0: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
5bd0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5be0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5bf0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
5c00: 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64 64 72  ound, iTab, addr
5c10: 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20 4e 29  Repeat, iMem, N)
5c20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5c30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5c50: 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20 4e  eRecord, iMem, N
5c60: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
5c70: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5c80: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
5c90: 54 61 62 2c 20 72 31 2c 20 69 4d 65 6d 2c 20 4e  Tab, r1, iMem, N
5ca0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
5cb0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5cc0: 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
5cd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
5ce0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5cf0: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
5d00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
5d10: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
5d20: 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20   for the inside 
5d30: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
5d40: 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54  p.** of a SELECT
5d50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61  ..**.** If srcTa
5d60: 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  b is negative, t
5d70: 68 65 6e 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  hen the p->pELis
5d80: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  t expressions.**
5d90: 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 69   are evaluated i
5da0: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
5db0: 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  he data for this
5dc0: 20 72 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62   row.  If srcTab
5dd0: 20 69 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d   is.** zero or m
5de0: 6f 72 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69  ore, then data i
5df0: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72  s pulled from sr
5e00: 63 54 61 62 20 61 6e 64 20 70 2d 3e 70 45 4c 69  cTab and p->pELi
5e10: 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  st is used only 
5e20: 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 6e  .** to get the n
5e30: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5e40: 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74 69   and the collati
5e50: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
5e60: 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a  each column..*/.
5e70: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
5e80: 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20 50  ctInnerLoop(.  P
5e90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
5eb0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
5ec0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
5ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5ee0: 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63 74   complete select
5ef0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
5f00: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
5f10: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f20: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f30: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f40: 20 69 66 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   if non-negative
5f50: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f60: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f70: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f80: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f90: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5fa0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5fb0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5fc0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fd0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fe0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5ff0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
6000: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
6010: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
6020: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6030: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6040: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6050: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6060: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6070: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6090: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
60a0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
60b0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
60c0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60d0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60e0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
6100: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
6110: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
6120: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6130: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6140: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6150: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6160: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6170: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6180: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
61a0: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
61b0: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
61c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61d0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61e0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61f0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
6200: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
6210: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
6220: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6230: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6240: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6250: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6260: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6270: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6280: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6290: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
62a0: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
62b0: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
62c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62d0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62e0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62f0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
6300: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
6310: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
6320: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6330: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6340: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6350: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6360: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6370: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6380: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6390: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
63a0: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
63b0: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
63c0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63d0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63e0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63f0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
6400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6410: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
6420: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6430: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6440: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6450: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
6460: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61  EList!=0 );.  ha
6470: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73  sDistinct = pDis
6480: 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63  tinct ? pDistinc
6490: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57  t->eTnctType : W
64a0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
64b0: 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20  OP;.  if( pSort 
64c0: 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  && pSort->pOrder
64d0: 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20  By==0 ) pSort = 
64e0: 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  0;.  if( pSort==
64f0: 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63  0 && !hasDistinc
6500: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
6510: 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b   iContinue!=0 );
6520: 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28  .    codeOffset(
6530: 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69  v, p->iOffset, i
6540: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a  Continue);.  }..
6550: 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65    /* Pull the re
6560: 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e  quested columns.
6570: 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43  .  */.  nResultC
6580: 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
6590: 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44  nExpr;..  if( pD
65a0: 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
65b0: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29  .    if( pSort )
65c0: 7b 0a 20 20 20 20 20 20 6e 50 72 65 66 69 78 52  {.      nPrefixR
65d0: 65 67 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  eg = pSort->pOrd
65e0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
65f0: 20 20 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e     if( !(pSort->
6600: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
6610: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20  FLAG_UseSorter) 
6620: 29 20 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a  ) nPrefixReg++;.
6630: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
6640: 65 6d 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67  em += nPrefixReg
6650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73  ;.    }.    pDes
6660: 74 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73  t->iSdst = pPars
6670: 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70  e->nMem+1;.    p
6680: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
6690: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c  ResultCol;.  }el
66a0: 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  se if( pDest->iS
66b0: 64 73 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e  dst+nResultCol >
66c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b   pParse->nMem ){
66d0: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
66e0: 61 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  an error conditi
66f0: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 73 75  on that can resu
6700: 6c 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  lt, for example,
6710: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20   when a SELECT. 
6720: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67     ** on the rig
6730: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6740: 61 6e 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69  an INSERT contai
6750: 6e 73 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63  ns more result c
6760: 6f 6c 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20  olumns than.    
6770: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c  ** there are col
6780: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
6790: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20  e on the left.  
67a0: 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
67b0: 65 20 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20  e caught.    ** 
67c0: 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
67d0: 65 72 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  er.  But we need
67e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e   to make sure en
67f0: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61  ough memory is a
6800: 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20  llocated.    ** 
6810: 74 6f 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73  to avoid other s
6820: 70 75 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69  purious errors i
6830: 6e 20 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20  n the meantime. 
6840: 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  */.    pParse->n
6850: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
6860: 6c 3b 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e  l;.  }.  pDest->
6870: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
6880: 6f 6c 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20  ol;.  regOrig = 
6890: 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73  regResult = pDes
68a0: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20  t->iSdst;.  if( 
68b0: 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20  srcTab>=0 ){.   
68c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73   for(i=0; i<nRes
68d0: 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ultCol; i++){.  
68e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
68f0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
6900: 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72  mn, srcTab, i, r
6910: 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20  egResult+i);.   
6920: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
6930: 76 2c 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69  v, "%s", p->pELi
6940: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29  st->a[i].zName))
6950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
6960: 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45  if( eDest!=SRT_E
6970: 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20  xists ){.    /* 
6980: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6990: 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28  on is an EXISTS(
69a0: 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c  ...) expression,
69b0: 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20   the actual.    
69c0: 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  ** values return
69d0: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
69e0: 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65   are not require
69f0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38  d..    */.    u8
6a00: 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20 20 20   ecelFlags;.    
6a10: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
6a20: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
6a30: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
6a40: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6a50: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
6a60: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
6a70: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
6a80: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
6a90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
6aa0: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
6ab0: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
6ac0: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
6ad0: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
6ae0: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
6af0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
6b00: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
6b10: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
6b20: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
6b30: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
6b40: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6b50: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
6b60: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
6b70: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
6b80: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
6b90: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
6ba0: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
6bb0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
6bc0: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
6bd0: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
6be0: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
6bf0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
6c00: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
6c10: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
6c20: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
6c30: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
6c40: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
6c50: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
6c60: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
6c70: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
6c80: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
6c90: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
6ca0: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
6cb0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
6cc0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53  ;.      for(i=pS
6cd0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70  ort->nOBSat; i<p
6ce0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
6cf0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6d00: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
6d10: 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53 6f      if( (j = pSo
6d20: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt->pOrderBy->a[
6d30: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
6d40: 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ol)>0 ){.       
6d50: 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b     p->pEList->a[
6d60: 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  j-1].u.x.iOrderB
6d70: 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74  yCol = i+1-pSort
6d80: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20  ->nOBSat;.      
6d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6da0: 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20    regOrig = 0;. 
6db0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
6dc0: 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65  st==SRT_Set || e
6dd0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20  Dest==SRT_Mem . 
6de0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65            || eDe
6df0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
6e00: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
6e10: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a  Output );.    }.
6e20: 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d      nResultCol =
6e30: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
6e40: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
6e50: 70 2d 3e 70 45 4c 69 73 74 2c 72 65 67 52 65 73  p->pEList,regRes
6e60: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
6e90: 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  ecelFlags);.  }.
6ea0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
6eb0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
6ec0: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
6ed0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6ee0: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
6ef0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
6f00: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
6f10: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
6f20: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
6f30: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
6f40: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
6f50: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
6f60: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
6f70: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
6f80: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
6f90: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
6fa0: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
6fb0: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
6fc0: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
6fd0: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
6fe0: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
6ff0: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7010: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
7020: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
7030: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
7040: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
7050: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
7060: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
7070: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
7080: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
7090: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
70a0: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
70b0: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
70c0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
70d0: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
70e0: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
70f0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
7100: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
7110: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
7120: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
7130: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
7140: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
7150: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
7160: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
7170: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
7180: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
7190: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
71a0: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
71b0: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
71c0: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
71d0: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
71e0: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
71f0: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
7200: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
7210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7220: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
7230: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
7240: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
7250: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
7260: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
7270: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
7280: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
7290: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
72a0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
72b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
72c0: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
72d0: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
72e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
72f0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
7300: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
7310: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
7320: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
7330: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
7340: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
7350: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7360: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
7370: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
7380: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
7390: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
73a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
73b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
73c0: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
73d0: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
73e0: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
73f0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7400: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
7410: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
7420: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7430: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
7440: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
7450: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
7460: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
7470: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
7480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
74a0: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
74b0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
74c0: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
74d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
74e0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
74f0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
7500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7510: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7520: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
7530: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
7540: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
7550: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
7560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7570: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
7580: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
7590: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
75a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
75b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
75c0: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
75d0: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
75e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
75f0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
7600: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
7610: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
7620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7630: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
7640: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
7650: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
7660: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
7670: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
7680: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
7690: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
76a0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
76b0: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
76c0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
76f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7700: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7710: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
7720: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
7730: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
7740: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
7750: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
7760: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
7770: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
7780: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
7790: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
77a0: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
77b0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
77c0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
77d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
77e0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
77f0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
7800: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
7810: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
7820: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7830: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7850: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
7860: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
7870: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
7880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7890: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
78a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
78b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
78c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
78d0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
78e0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
78f0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
7900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
7910: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
7920: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
7930: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
7940: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
7950: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
7960: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
7970: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
7980: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
7990: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
79a0: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
79b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
79c0: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
79d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
79e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
79f0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
7a00: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7a10: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
7a20: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
7a30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7a40: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7a50: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
7a60: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
7a70: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
7a80: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
7a90: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
7aa0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
7ab0: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
7ac0: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
7ad0: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
7ae0: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
7af0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
7b00: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
7b10: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
7b20: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7b30: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
7b40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
7b50: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
7b60: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
7b70: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
7b80: 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  ==SRT_Fifo );.  
7b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ba0: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
7bb0: 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  o );.      sqlit
7bc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7bd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7be0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
7bf0: 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78  tCol, r1+nPrefix
7c00: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
7c10: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
7c20: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
7c30: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20  RT_DistFifo ){. 
7c40: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
7c50: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
7c60: 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63  DistFifo, then c
7c70: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
7c80: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
7c90: 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72  ** on an ephemer
7ca0: 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  al index. If the
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
7cc0: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
7cd0: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
7ce0: 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20  e index, do not 
7cf0: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
7d00: 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20  output. If not, 
7d10: 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  add the.        
7d20: 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74  ** current row t
7d30: 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  o the index and 
7d40: 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69  proceed with wri
7d50: 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20  ting it to the. 
7d60: 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
7d70: 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20   table as well. 
7d80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
7d90: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
7da0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
7db0: 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71   + 4;.        sq
7dc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
7dd0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
7de0: 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72  iParm+1, addr, r
7df0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
7e00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7e10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7e20: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7e30: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7e40: 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73  arm+1, r1,regRes
7e50: 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult,nResultCol);
7e60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7e70: 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20   pSort==0 );.   
7e80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7e90: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
7ea0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
7eb0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
7ec0: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
7ed0: 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c  ixReg,regResult,
7ee0: 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  1,nPrefixReg);. 
7ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7f00: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
7f10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
7f20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
7f30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7f40: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7f50: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
7f60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7f70: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7f80: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
7f90: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
7fa0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
7fb0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
7fc0: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
7fd0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7fe0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
7ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8000: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
8010: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
8020: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
8030: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8040: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
8050: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
8060: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
8070: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
8080: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
8090: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
80a0: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
80b0: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
80c0: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
80d0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
80e0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
80f0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
8100: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
8110: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
8120: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
8130: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
8140: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
8150: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
8160: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
8170: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
8180: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
8190: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
81a0: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
81b0: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
81c0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
81d0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
81e0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
81f0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
8200: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
8210: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
8220: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
8230: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
8240: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
8250: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
8260: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
8270: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
8280: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
8290: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
82a0: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
82b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
82c0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
82d0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
82e0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
82f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
8300: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
8310: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
8320: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
8330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8340: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
8350: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
8360: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
8370: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
8380: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
8390: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
83a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
83b0: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
83c0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
83d0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
83e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
83f0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8400: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
8410: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
8420: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
8430: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8440: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8450: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
8460: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8470: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
8480: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
8490: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
84a0: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
84b0: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
84c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
84d0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
84e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
84f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8500: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
8510: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
8520: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
8530: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
8540: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
8550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
8560: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
8570: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
8580: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
8590: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
85a0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
85b0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
85c0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
85d0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
85e0: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
85f0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
8600: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
8610: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
8620: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
8630: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
8640: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
8650: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
8660: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
8670: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
8680: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
8690: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
86a0: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
86b0: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
86c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
86d0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
86e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
86f0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
8700: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
8710: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
8720: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
8730: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
8740: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
8750: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
8760: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
8770: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
8780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8790: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
87a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
87b0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
87c0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
87d0: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
87e0: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
87f0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
8800: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
8810: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
8820: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
8830: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
8840: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
8850: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
8860: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8870: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
8880: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
8890: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
88a0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
88b0: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
88c0: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
88d0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
8900: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8910: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
8920: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
8930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8940: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
8950: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
8960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8980: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
8990: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
89a0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
89b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
89c0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
89d0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
89e0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
89f0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
8a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a10: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
8a20: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
8a30: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
8a40: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
8a50: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
8a60: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
8a70: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
8a80: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
8a90: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
8aa0: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
8ab0: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
8ac0: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
8ad0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
8ae0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
8af0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
8b00: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
8b10: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
8b20: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
8b30: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
8b40: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
8b50: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
8b60: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
8b70: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
8b80: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
8b90: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
8ba0: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
8bb0: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
8bc0: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
8bd0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
8be0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
8bf0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
8c00: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
8c10: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
8c20: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
8c30: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
8c40: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
8c50: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
8c60: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
8c70: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
8c80: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
8c90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8ca0: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
8cb0: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
8cc0: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
8cd0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
8ce0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
8cf0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
8d00: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
8d10: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
8d20: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
8d30: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
8d40: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
8d50: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
8d60: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
8d70: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
8d80: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
8d90: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
8da0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
8db0: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
8dc0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
8dd0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
8de0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8df0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
8e00: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
8e30: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8e40: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
8e50: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
8e60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
8e70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
8e80: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
8e90: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
8ea0: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
8eb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8ec0: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
8ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ee0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8ef0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
8f00: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
8f10: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8f20: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
8f30: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
8f40: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
8f50: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
8f60: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8f80: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
8f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fa0: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
8fb0: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
8fc0: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fe0: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
8ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9000: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9010: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
9020: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
9030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9040: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
9050: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
9060: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
9070: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9080: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
9090: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
90a0: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
90b0: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
90c0: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
90d0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
90e0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
90f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9100: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9110: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
9120: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
9130: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
9140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9150: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
9160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
9170: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
9180: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
9190: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
91a0: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
91b0: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
91c0: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
91d0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
91e0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
91f0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
9200: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
9210: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
9220: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
9230: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
9240: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
9250: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
9260: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
9270: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
9280: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
9290: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
92a0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
92b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
92c0: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
92d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
92e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
92f0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
9300: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
9310: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
9320: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
9330: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
9340: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
9350: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
9360: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
9370: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
9380: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
9390: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
93a0: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
93b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
93c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
93d0: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
93e0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
93f0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
9400: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
9410: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
9420: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
9430: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
9440: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
9450: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
9460: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
9470: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
9480: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
9490: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
94a0: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
94b0: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
94c0: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
94d0: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
94e0: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
94f0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
9500: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
9510: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
9520: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
9530: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
9540: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
9550: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
9560: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
9570: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
9580: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
9590: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
95a0: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
95b0: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
95c0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
95d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
95e0: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
95f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9600: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
9610: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9620: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
9630: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
9640: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
9650: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
9660: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
9670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
9680: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
9690: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
96a0: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
96b0: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
96c0: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
96d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
96e0: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
96f0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
9700: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
9710: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
9720: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
9730: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
9740: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9750: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9760: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
9770: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
9780: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
9790: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
97a0: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
97b0: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
97c0: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
97d0: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
97e0: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
97f0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
9800: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
9810: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
9820: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9830: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
9840: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
9850: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
9860: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
9870: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
9880: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
9890: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
98a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
98b0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
98c0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
98d0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
98e0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
98f0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
9900: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
9910: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
9920: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
9930: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
9940: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
9950: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
9960: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
9970: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
9980: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
9990: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
99a0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
99b0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
99c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
99d0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
99e0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
99f0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
9a00: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
9a10: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
9a20: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
9a30: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
9a40: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
9a50: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
9a60: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
9a70: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
9a80: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
9a90: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
9aa0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
9ab0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
9ac0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
9ad0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
9ae0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
9af0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9b00: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
9b10: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
9b20: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
9b30: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
9b40: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
9b50: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
9b60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9b70: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
9b80: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9b90: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
9ba0: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
9bb0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
9bc0: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
9bd0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
9be0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
9bf0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
9c00: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
9c10: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
9c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9c30: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
9c40: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
9c50: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
9c60: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
9c70: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
9c80: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9c90: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
9ca0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9cb0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
9cc0: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
9cd0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
9ce0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
9cf0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
9d00: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
9d10: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
9d30: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
9d40: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
9d50: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
9d60: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
9d70: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
9d80: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9d90: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
9da0: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
9db0: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
9dc0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
9dd0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
9de0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
9df0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
9e00: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
9e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
9e20: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
9e30: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
9e40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
9e50: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
9e60: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
9e70: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
9e80: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
9e90: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
9ea0: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
9eb0: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
9ec0: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
9ed0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
9ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9ef0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
9f00: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
9f10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9f20: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
9f30: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
9f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
9f50: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
9f60: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
9f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
9f80: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
9f90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9fa0: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
9fb0: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
9fc0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
9fd0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
9fe0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
9ff0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a000: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a010: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a020: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a030: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a040: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a050: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
a060: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
a070: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
a080: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
a090: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
a0a0: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
a0b0: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
a0c0: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
a0d0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
a0e0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
a0f0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
a100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a110: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
a120: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
a130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
a140: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72  age){.  if( pPar
a150: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
a160: 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
a170: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a180: 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20     char *zMsg = 
a190: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
a1a0: 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20  Parse->db, "USE 
a1b0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
a1c0: 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20  %s", zUsage);.  
a1d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a1e0: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
a1f0: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
a200: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
a210: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
a220: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69   }.}../*.** Assi
a230: 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20  gn expression b 
a240: 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73  to lvalue a. A s
a250: 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65  econd, no-op, ve
a260: 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61  rsion of this ma
a270: 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64  cro.** is provid
a280: 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f  ed when SQLITE_O
a290: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64  MIT_EXPLAIN is d
a2a0: 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c  efined. This all
a2b0: 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20  ows the code.** 
a2c0: 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  in sqlite3Select
a2d0: 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c  () to assign val
a2e0: 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72 65  ues to structure
a2f0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
a300: 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65  s that.** only e
a310: 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f  xist if SQLITE_O
a320: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e  MIT_EXPLAIN is n
a330: 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f  ot defined witho
a340: 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65  ut polluting the
a350: 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69  .** code with #i
a360: 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65 73  fndef directives
a370: 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  ..*/.# define ex
a380: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
a390: 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c  a, b) a = b..#el
a3a0: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
a3b0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
a3c0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
a3d0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
a3e0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
a3f0: 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29  inTempTable(y,z)
a400: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
a410: 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29  nSetInteger(y,z)
a420: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
a430: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a440: 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64  T_EXPLAIN) && !d
a450: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
a460: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
a470: 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  CT)./*.** Unless
a480: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
a490: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
a4a0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
a4b0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
a4c0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
a4d0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
a4e0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
a4f0: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
a500: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
a510: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
a520: 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ion is of one of
a530: 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a   the two forms:.
a540: 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49  **.**   "COMPOSI
a550: 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53  TE SUBQUERIES iS
a560: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f  ub1 and iSub2 (o
a570: 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  p)".**   "COMPOS
a580: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
a590: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 55  Sub1 and iSub2 U
a5a0: 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
a5b0: 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65   (op)".**.** whe
a5c0: 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  re iSub1 and iSu
a5d0: 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  b2 are the integ
a5e0: 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74 68  ers passed as th
a5f0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
a600: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ** function para
a610: 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69  meters, and op i
a620: 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  s the text repre
a630: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
a640: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
a650: 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
a660: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f  The parameter "o
a670: 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  p" must be one o
a680: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
a690: 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54  XCEPT,.** TK_INT
a6a0: 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c  ERSECT or TK_ALL
a6b0: 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  . The first form
a6c0: 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67 75   is used if argu
a6d0: 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20  ment bUseTmp is 
a6e0: 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68  .** false, or th
a6f0: 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66  e second form if
a700: 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a   it is true..*/.
a710: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
a720: 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20  ainComposite(.  
a730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
a760: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
a790: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
a7a0: 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  EPT etc. */.  in
a7b0: 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20 20  t iSub1,        
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a7d0: 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20 2a   Subquery id 1 *
a7e0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20  /.  int iSub2,  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a800: 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20      /* Subquery 
a810: 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55  id 2 */.  int bU
a820: 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20 20  seTmp           
a830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
a840: 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c  e if a temp tabl
a850: 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b  e was used */.){
a860: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54  .  assert( op==T
a870: 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54  K_UNION || op==T
a880: 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
a890: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20  TK_INTERSECT || 
a8a0: 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20  op==TK_ALL );.  
a8b0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
a8c0: 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64  ain==2 ){.    Vd
a8d0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
a8e0: 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20  pVdbe;.    char 
a8f0: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  *zMsg = sqlite3M
a900: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
a910: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d  pParse->db, "COM
a920: 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45 53  POUND SUBQUERIES
a930: 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25 73   %d AND %d %s(%s
a940: 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32  )", iSub1, iSub2
a950: 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54 6d  ,.        bUseTm
a960: 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  p?"USING TEMP B-
a970: 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63  TREE ":"", selec
a980: 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20  tOpName(op).    
a990: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a9a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a9b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a9c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a9d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a9e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  C);.  }.}.#else.
a9f0: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
aa00: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
aa10: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
aa20: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
aa30: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43   define explainC
aa40: 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79  omposite(v,w,x,y
aa50: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
aa60: 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c  * If the inner l
aa70: 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74 65  oop was generate
aa80: 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75  d using a non-nu
aa90: 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67 75  ll pOrderBy argu
aaa0: 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ment,.** then th
aab0: 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20 70  e results were p
aac0: 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65  laced in a sorte
aad0: 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f  r.  After the lo
aae0: 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64  op is terminated
aaf0: 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72  .** we need to r
ab00: 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e  un the sorter an
ab10: 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65 73  d output the res
ab20: 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ults.  The follo
ab30: 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  wing.** routine 
ab40: 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
ab50: 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20  de needed to do 
ab60: 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  that..*/.static 
ab70: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72  void generateSor
ab80: 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a  tTail(.  Parse *
ab90: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
aba0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
abb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
abc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
abd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
abe0: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
abf0: 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ,   /* Informati
ac00: 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20  on on the ORDER 
ac10: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
ac20: 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  nt nColumn,     
ac30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
ac40: 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f  lumns of data */
ac50: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
ac60: 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74 68  Dest /* Write th
ac70: 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74 73  e sorted results
ac80: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 64   here */.){.  Vd
ac90: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
aca0: 70 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20  pVdbe;          
acb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
acc0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
acd0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  ment */.  int ad
ace0: 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72 74 2d  drBreak = pSort-
acf0: 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20 20  >labelDone;     
ad00: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
ad10: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
ad20: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
ad30: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
ad40: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
ad50: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
ad60: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
ad70: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
ad80: 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20 30  int addrOnce = 0
ad90: 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
ada0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
adb0: 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  By = pSort->pOrd
adc0: 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65 73  erBy;.  int eDes
add0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
ade0: 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  ;.  int iParm = 
adf0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a  pDest->iSDParm;.
ae00: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
ae10: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20 20  int regRowid;.  
ae20: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20  int iCol;.  int 
ae30: 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 53 6f 72  nKey;.  int iSor
ae40: 74 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  tTab;           
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65          /* Sorte
ae60: 72 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64  r cursor to read
ae70: 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e   from */.  int n
ae80: 53 6f 72 74 44 61 74 61 3b 20 20 20 20 20 20 20  SortData;       
ae90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
aea0: 61 69 6c 69 6e 67 20 76 61 6c 75 65 73 20 74 6f  ailing values to
aeb0: 20 72 65 61 64 20 66 72 6f 6d 20 73 6f 72 74 65   read from sorte
aec0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20  r */.  int i;.  
aed0: 69 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20  int bSeq;       
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aef0: 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65  /* True if sorte
af00: 72 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65  r record include
af10: 73 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20  s seq. no. */.  
af20: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
af30: 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70  item *aOutEx = p
af40: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20  ->pEList->a;..  
af50: 61 73 73 65 72 74 28 20 61 64 64 72 42 72 65 61  assert( addrBrea
af60: 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70 53 6f  k<0 );.  if( pSo
af70: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29  rt->labelBkOut )
af80: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
af90: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
afa0: 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52  sub, pSort->regR
afb0: 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61  eturn, pSort->la
afc0: 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73  belBkOut);.    s
afd0: 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
afe0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
aff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
b000: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f  olveLabel(v, pSo
b010: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
b020: 0a 20 20 7d 0a 20 20 69 54 61 62 20 3d 20 70 53  .  }.  iTab = pS
b030: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20  ort->iECursor;. 
b040: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
b050: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
b060: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c  =SRT_Coroutine |
b070: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  | eDest==SRT_Mem
b080: 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64   ){.    regRowid
b090: 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f 77   = 0;.    regRow
b0a0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
b0b0: 0a 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d  .    nSortData =
b0c0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73   nColumn;.  }els
b0d0: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
b0e0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
b0f0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
b100: 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74 65   regRow = sqlite
b110: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
b120: 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  arse, nColumn);.
b130: 20 20 20 20 6e 53 6f 72 74 44 61 74 61 20 3d 20      nSortData = 
b140: 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20 20 6e  nColumn;.  }.  n
b150: 4b 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Key = pOrderBy->
b160: 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e  nExpr - pSort->n
b170: 4f 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f  OBSat;.  if( pSo
b180: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
b190: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
b1a0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  er ){.    int re
b1b0: 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61  gSortOut = ++pPa
b1c0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
b1d0: 53 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65  SortTab = pParse
b1e0: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66  ->nTab++;.    if
b1f0: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
b200: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64  Out ){.      add
b210: 72 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56  rOnce = sqlite3V
b220: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
b230: 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72  Once); VdbeCover
b240: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
b250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b260: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
b270: 65 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20  eudo, iSortTab, 
b280: 72 65 67 53 6f 72 74 4f 75 74 2c 20 6e 4b 65 79  regSortOut, nKey
b290: 2b 31 2b 6e 53 6f 72 74 44 61 74 61 29 3b 0a 20  +1+nSortData);. 
b2a0: 20 20 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20     if( addrOnce 
b2b0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
b2c0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63  pHere(v, addrOnc
b2d0: 65 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  e);.    addr = 1
b2e0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
b2f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
b300: 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64  rSort, iTab, add
b310: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
b320: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b330: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
b340: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
b350: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73  Continue);.    s
b360: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
b370: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
b380: 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74  a, iTab, regSort
b390: 4f 75 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a  Out, iSortTab);.
b3a0: 20 20 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20      bSeq = 0;.  
b3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20  }else{.    addr 
b3c0: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
b3d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
b3e0: 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72  rt, iTab, addrBr
b3f0: 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
b400: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
b410: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
b420: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
b430: 65 29 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  e);.    iSortTab
b440: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65   = iTab;.    bSe
b450: 71 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72  q = 1;.  }.  for
b460: 28 69 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b  (i=0, iCol=nKey+
b470: 62 53 65 71 3b 20 69 3c 6e 53 6f 72 74 44 61 74  bSeq; i<nSortDat
b480: 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  a; i++){.    int
b490: 20 69 52 65 61 64 3b 0a 20 20 20 20 69 66 28 20   iRead;.    if( 
b4a0: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b4b0: 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20  rderByCol ){.   
b4c0: 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74 45     iRead = aOutE
b4d0: 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  x[i].u.x.iOrderB
b4e0: 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  yCol-1;.    }els
b4f0: 65 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d  e{.      iRead =
b500: 20 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iCol++;.    }. 
b510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b520: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
b530: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65  n, iSortTab, iRe
b540: 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  ad, regRow+i);. 
b550: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
b560: 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45 78 5b  v, "%s", aOutEx[
b570: 69 5d 2e 7a 4e 61 6d 65 20 3f 20 61 4f 75 74 45  i].zName ? aOutE
b580: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
b590: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
b5a0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
b5b0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
b5c0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
b5d0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
b5e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b5f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b600: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
b610: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
b620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b630: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
b640: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
b650: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
b660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b670: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
b680: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
b690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
b6a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b6b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
b6c0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
b6d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
b6e0: 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72  lumn==sqlite3Str
b6f0: 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66  len30(pDest->zAf
b700: 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20 20  fSdst) );.      
b710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b720: 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  4(v, OP_MakeReco
b730: 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  rd, regRow, nCol
b740: 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20  umn, regRowid,. 
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 41         pDest->zA
b770: 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29  ffSdst, nColumn)
b780: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b790: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
b7a0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
b7b0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
b7c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b7d0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
b7e0: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
b7f0: 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65  rm, regRowid, re
b800: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
b810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b820: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
b830: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  Mem: {.      /* 
b840: 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  The LIMIT clause
b850: 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   will terminate 
b860: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
b870: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
b880: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b890: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b8a0: 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d    assert( eDest=
b8b0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b8c0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b8d0: 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65  ine ); .      te
b8e0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
b8f0: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
b900: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b910: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
b920: 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  e );.      if( e
b930: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b940: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b950: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b960: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
b970: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
b980: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
b990: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
b9a0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
b9b0: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64  arse, pDest->iSd
b9c0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
b9d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b9f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
ba00: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
ba10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ba20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ba30: 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64  }.  if( regRowid
ba40: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73   ){.    if( eDes
ba50: 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20  t==SRT_Set ){.  
ba60: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
ba70: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
ba80: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
ba90: 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  umn);.    }else{
baa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
bab0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
bac0: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
bad0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52    }.    sqlite3R
bae0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
baf0: 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b  arse, regRowid);
bb00: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f  .  }.  /* The bo
bb10: 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
bb20: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
bb30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
bb40: 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  v, addrContinue)
bb50: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  ;.  if( pSort->s
bb60: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
bb70: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
bb80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bb90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
bba0: 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61  terNext, iTab, a
bbb0: 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ddr); VdbeCovera
bbc0: 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ge(v);.  }else{.
bbd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bbe0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
bbf0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
bc00: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bc10: 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d    }.  if( pSort-
bc20: 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c  >regReturn ) sql
bc30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
bc40: 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f  , OP_Return, pSo
bc50: 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  rt->regReturn);.
bc60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
bc70: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
bc80: 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rBreak);.}../*.*
bc90: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
bca0: 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63  er to a string c
bcb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64  ontaining the 'd
bcc0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27  eclaration type'
bcd0: 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   of the.** expre
bce0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65  ssion pExpr. The
bcf0: 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74   string may be t
bd00: 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63  reated as static
bd10: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
bd20: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74  **.** Also try t
bd30: 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73  o estimate the s
bd40: 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72  ize of the retur
bd50: 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65  ned value and re
bd60: 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73  turn that.** res
bd70: 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74  ult in *pEstWidt
bd80: 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63  h..**.** The dec
bd90: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73  laration type is
bda0: 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74   the exact datat
bdb0: 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65  ype definition e
bdc0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
bdd0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52  e.** original CR
bde0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
bdf0: 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72  ment if the expr
be00: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
be10: 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61  mn. The.** decla
be20: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
be30: 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73  a ROWID field is
be40: 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c   INTEGER. Exactl
be50: 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73  y when an expres
be60: 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  sion.** is consi
be70: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63  dered a column c
be80: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e  an be complex in
be90: 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66   the presence of
bea0: 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65   subqueries. The
beb0: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
bec0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c  xpression in all
bed0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
bee0: 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  g SELECT stateme
bef0: 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69  nts is .** consi
bf00: 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62  dered a column b
bf10: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
bf20: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
bf30: 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a  col FROM tbl;.**
bf40: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
bf50: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
bf60: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
bf70: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
bf80: 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61  );.**   SELECT a
bf90: 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  bc FROM (SELECT 
bfa0: 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20  col AS abc FROM 
bfb0: 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  tbl);.** .** The
bfc0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
bfd0: 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73  e for any expres
bfe0: 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  sion other than 
bff0: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c  a column is NULL
c000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
c010: 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20  tine has either 
c020: 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72  3 or 6 parameter
c030: 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  s depending on w
c040: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
c050: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
c060: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
c070: 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  TA compile-time 
c080: 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a  option is used..
c090: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
c0a0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c0b0: 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65  ETADATA.# define
c0c0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
c0d0: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
c0e0: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c  ypeImpl(A,B,C,D,
c0f0: 45 2c 46 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66  E,F).#else /* if
c100: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c110: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c120: 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65  ETADATA) */.# de
c130: 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28  fine columnType(
c140: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c  A,B,C,D,E,F) col
c150: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
c160: 46 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  F).#endif.static
c170: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
c180: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
c190: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
c1a0: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
c1b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c1c0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
c1d0: 41 44 41 54 41 0a 20 20 63 6f 6e 73 74 20 63 68  ADATA.  const ch
c1e0: 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20  ar **pzOrigDb,. 
c1f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
c200: 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74  OrigTab,.  const
c210: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f   char **pzOrigCo
c220: 6c 2c 0a 23 65 6e 64 69 66 0a 20 20 75 38 20 2a  l,.#endif.  u8 *
c230: 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63  pEstWidth.){.  c
c240: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65  har const *zType
c250: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
c260: 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20 31   u8 estWidth = 1
c270: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
c280: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
c290: 54 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f  TADATA.  char co
c2a0: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
c2b0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
c2c0: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
c2d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
c2e0: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  gCol = 0;.#endif
c2f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ..  assert( pExp
c300: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
c310: 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21  ( pNC->pSrcList!
c320: 3d 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  =0 );.  switch( 
c330: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
c340: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c   case TK_AGG_COL
c350: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
c360: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
c370: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c380: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
c390: 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
c3a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62   the column is b
c3b0: 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65 78  eing.      ** ex
c3c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e 20  tracted from in 
c3d0: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72 63  NameContext.pSrc
c3e0: 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c 65  List. This table
c3f0: 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20 20   may be real.   
c400: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 74     ** database t
c410: 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75 65  able or a subque
c420: 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ry..      */.   
c430: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
c440: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
c450: 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  * Table structur
c460: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
c470: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
c480: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
c490: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c4a0: 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63 6f  /* Select the co
c4b0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
c4c0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
c4d0: 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70 72  int iCol = pExpr
c4e0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49  ->iColumn;  /* I
c4f0: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  ndex of column i
c500: 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20 20  n pTab */.      
c510: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
c520: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
c530: 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MN );.      test
c540: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
c550: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  =TK_COLUMN );.  
c560: 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26      while( pNC &
c570: 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 20  & !pTab ){.     
c580: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62     SrcList *pTab
c590: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
c5a0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
c5b0: 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74  r(j=0;j<pTabList
c5c0: 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c 69  ->nSrc && pTabLi
c5d0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
c5e0: 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b  !=pExpr->iTable;
c5f0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  j++);.        if
c600: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
c610: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
c620: 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d  pTab = pTabList-
c630: 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20  >a[j].pTab;.    
c640: 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62 4c        pS = pTabL
c650: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63  ist->a[j].pSelec
c660: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
c670: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 20  {.          pNC 
c680: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
c690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c6a0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
c6b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
c6c0: 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f   At one time, co
c6d0: 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c 45  de such as "SELE
c6e0: 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69 6e  CT new.x" within
c6f0: 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c 64   a trigger would
c700: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73  .        ** caus
c710: 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  e this condition
c720: 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65 20   to run.  Since 
c730: 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72 65  then, we have re
c740: 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a 20  structured how. 
c750: 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67 65         ** trigge
c760: 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61  r code is genera
c770: 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ted and so this 
c780: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20  condition is no 
c790: 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20 20  longer .        
c7a0: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77  ** possible. How
c7b0: 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74 69  ever, it can sti
c7c0: 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20 73  ll be true for s
c7d0: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20  tatements like. 
c7e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f         ** the fo
c7f0: 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20 20  llowing:.       
c800: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
c810: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
c820: 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20  (col INTEGER);. 
c830: 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
c840: 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  CT (SELECT t1.co
c850: 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b  l) FROM FROM t1;
c860: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
c870: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75      ** when colu
c880: 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c  mnType() is call
c890: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ed on the expres
c8a0: 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e  sion "t1.col" in
c8b0: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
c8c0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20   sub-select. In 
c8d0: 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20 74  this case, set t
c8e0: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74  he column type t
c8f0: 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20  o NULL, even.   
c900: 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 69       ** though i
c910: 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20  t should really 
c920: 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20 20  be "INTEGER"..  
c930: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c940: 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
c950: 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68  a problem, as th
c960: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66  e column type of
c970: 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76   "t1.col" is nev
c980: 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  er.        ** us
c990: 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54  ed. When columnT
c9a0: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
c9b0: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
c9c0: 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22 28  n .        ** "(
c9d0: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c  SELECT t1.col)",
c9e0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70   the correct typ
c9f0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28 73  e is returned (s
ca00: 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43 54  ee the TK_SELECT
ca10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61 6e  .        ** bran
ca20: 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ch below.  */.  
ca30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ca40: 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
ca50: 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78 70  rt( pTab && pExp
ca60: 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29 3b  r->pTab==pTab );
ca70: 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29 7b  .      if( pS ){
ca80: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
ca90: 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75 61  "table" is actua
caa0: 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63 74  lly a sub-select
cab0: 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74 68   or a view in th
cac0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20  e FROM clause.  
cad0: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
cae0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
caf0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63  . Return the dec
cb00: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e  laration type an
cb10: 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20 20  d origin.       
cb20: 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 65   ** data for the
cb30: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
cb40: 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  mn of the sub-se
cb50: 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  lect..        */
cb60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
cb70: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d  l>=0 && iCol<pS-
cb80: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
cb90: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
cba0: 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74  f iCol is less t
cbb0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
cbc0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
cbd0: 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20  quests the.     
cbe0: 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66       ** rowid of
cbf0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
cc00: 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78  or view. This ex
cc10: 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61  pression is lega
cc20: 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20  l (see .        
cc30: 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d    ** test case m
cc40: 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61  isc2.2.2) - it a
cc50: 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20  lways evaluates 
cc60: 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20  to NULL..       
cc70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
cc80: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
cc90: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
cca0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
ccb0: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
ccc0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53            sNC.pS
ccd0: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
cce0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  c;.          sNC
ccf0: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
cd00: 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72          sNC.pPar
cd10: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
cd20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
cd30: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
cd40: 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c  sNC, p,&zOrigDb,
cd50: 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67  &zOrigTab,&zOrig
cd60: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
cd70: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
cd80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
cd90: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
cda0: 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74       /* A real t
cdb0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
cdc0: 61 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20  assert( !pS );. 
cdd0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cde0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
cdf0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
ce00: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31  assert( iCol==-1
ce10: 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20   || (iCol>=0 && 
ce20: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29  iCol<pTab->nCol)
ce30: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
ce40: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
ce50: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20  METADATA.       
ce60: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
ce70: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
ce80: 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
ce90: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
cea0: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
ceb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cec0: 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54     zOrigCol = pT
ced0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
cee0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
cef0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
cf00: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
cf10: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
cf20: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
cf30: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
cf40: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
cf50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
cf60: 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e  OrigTab = pTab->
cf70: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
cf80: 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29  f( pNC->pParse )
cf90: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
cfa0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
cfb0: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
cfc0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
cfd0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
cfe0: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
cff0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
d000: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
d010: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
d020: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
d030: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
d040: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
d050: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
d060: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d070: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43  zType = sqlite3C
d080: 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d  olumnType(&pTab-
d090: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a  >aCol[iCol],0);.
d0a0: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
d0b0: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
d0c0: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
d0d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
d0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d0f0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
d100: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
d110: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
d120: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
d130: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
d140: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
d150: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
d160: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d170: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
d180: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
d190: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
d1a0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d1b0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
d1c0: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
d1d0: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
d1e0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
d1f0: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
d200: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
d210: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
d220: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
d230: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
d240: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
d250: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
d260: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
d270: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
d280: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
d290: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
d2a0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
d2b0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
d2c0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
d2d0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d2e0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
d2f0: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
d300: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
d310: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
d320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d330: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
d340: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d350: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
d360: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
d370: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d380: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
d390: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
d3a0: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
d3b0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
d3c0: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
d3d0: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
d3e0: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
d3f0: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
d400: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
d410: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
d420: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
d430: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d440: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
d450: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
d460: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d470: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
d480: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d490: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
d4a0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
d4b0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
d4c0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
d4d0: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
d4e0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
d4f0: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
d500: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
d510: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
d520: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
d530: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
d540: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
d550: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d560: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
d570: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
d580: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
d590: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
d5a0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
d5b0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
d5c0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
d5d0: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65 78  arse;.  sNC.pNex
d5e0: 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  t = 0;.  for(i=0
d5f0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
d600: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
d610: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
d620: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
d630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
d640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d650: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
d660: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
d670: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
d680: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
d690: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
d6a0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
d6b0: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
d6c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
d6d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
d6e0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
d6f0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
d700: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
d710: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
d720: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
d730: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
d740: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
d750: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
d760: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
d770: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
d780: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
d790: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
d7a0: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
d7b0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
d7c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d7d0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d7e0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
d7f0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
d800: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
d810: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
d820: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
d830: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
d840: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
d850: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
d860: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d870: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
d880: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
d890: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d8a0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
d8b0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d8c0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
d8d0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
d8e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
d8f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
d900: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
d910: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
d920: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
d930: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
d940: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
d950: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  TYPE) */.}.../*.
d960: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  ** Compute the c
d970: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
d980: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
d990: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  nt..**.** The on
d9a0: 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ly guarantee tha
d9b0: 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61  t SQLite makes a
d9c0: 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
d9d0: 73 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  s is that if the
d9e0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61  .** column has a
d9f0: 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69  n AS clause assi
da00: 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c  gning it a name,
da10: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68   that will be th
da20: 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20  e name used..** 
da30: 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79  That is the only
da40: 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72   documented guar
da50: 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c  antee.  However,
da60: 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69   countless appli
da70: 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c  cations.** devel
da80: 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65  oped over the ye
da90: 61 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61  ars have made ba
daa0: 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f  seless assumptio
dab0: 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20  ns about column 
dac0: 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c  names.** and wil
dad0: 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65  l break if those
dae0: 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61   assumptions cha
daf0: 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73  nges.  Hence, us
db00: 65 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f  e extreme cautio
db10: 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79  n.** when modify
db20: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
db30: 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69   to avoid breaki
db40: 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a  ng legacy..**.**
db50: 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74   See Also: sqlit
db60: 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
db70: 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68  rList().**.** Th
db80: 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74 5f 63  e PRAGMA short_c
db90: 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20  olumn_names and 
dba0: 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75  PRAGMA full_colu
dbb0: 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69 6e 67  mn_names setting
dbc0: 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65 63 61  s are.** depreca
dbd0: 74 65 64 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ted.  The defaul
dbe0: 74 20 73 65 74 74 69 6e 67 20 69 73 20 73 68 6f  t setting is sho
dbf0: 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e  rt=ON, full=OFF.
dc00: 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a    99.9% of all.*
dc10: 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 73  * applications s
dc20: 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20 74 68  hould operate th
dc30: 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72 74 68  is way.  Neverth
dc40: 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64 20 74  eless, we need t
dc50: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a  o support the.**
dc60: 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66 6f 72   other modes for
dc70: 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20   legacy:.**.**  
dc80: 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c    short=OFF, ful
dc90: 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f 6c 75  l=OFF:      Colu
dca0: 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65 20 74  mn name is the t
dcb0: 65 78 74 20 6f 66 20 74 68 65 20 65 78 70 72 65  ext of the expre
dcc0: 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20  ssion has it.** 
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72 69               ori
dcf0: 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72 73 20  ginally appears 
dd00: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
dd10: 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20  atement.  In.** 
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 74 68               oth
dd40: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 7a 53  er words, the zS
dd50: 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  pan of the resul
dd60: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
dd70: 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c  .**    short=ON,
dd80: 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20   full=OFF:      
dd90: 20 28 54 68 69 73 20 69 73 20 74 68 65 20 64 65   (This is the de
dda0: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29 2e 20  fault setting). 
ddb0: 20 49 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a   If the result.*
ddc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
dde0: 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
ddf0: 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
de00: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20  , then the.**   
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
de30: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  t column name is
de40: 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c 65 20   just the table 
de50: 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20  column.**       
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 6e 61 6d 65 3a 20 43 4f 4c         name: COL
de80: 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20  UMN.  Otherwise 
de90: 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a  use zSpan..**.**
dea0: 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f      full=ON, sho
deb0: 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20 49 66  rt=ANY:       If
dec0: 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 66 65   the result refe
ded0: 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
dee0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a   table column,.*
def0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
df00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
df10: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  hen the result c
df20: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20  olumn name with 
df30: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a  the table name.*
df40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
df60: 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42 4c 45  refix, ex: TABLE
df70: 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77  .COLUMN.  Otherw
df80: 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a  ise use zSpan..*
df90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
dfa0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
dfb0: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
dfc0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
dfd0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
dfe0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
dff0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
e000: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
e010: 20 74 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   this SELECT sta
e020: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  tement */.){.  V
e030: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
e040: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
e050: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
e060: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
e070: 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  ist;.  ExprList 
e080: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  *pEList;.  sqlit
e090: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e0a0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
e0b0: 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45  ame;    /* TABLE
e0c0: 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53  .COLUMN if no AS
e0d0: 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73 20 61   clause and is a
e0e0: 20 64 69 72 65 63 74 20 74 61 62 6c 65 20 72 65   direct table re
e0f0: 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61  f */.  int srcNa
e100: 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d  me;     /* COLUM
e110: 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d  N or TABLE.COLUM
e120: 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75 73  N if no AS claus
e130: 65 20 61 6e 64 20 69 73 20 64 69 72 65 63 74 20  e and is direct 
e140: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
e150: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
e160: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
e170: 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70  an EXPLAIN, skip
e180: 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20   this step */.  
e190: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
e1a0: 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ain ){.    retur
e1b0: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
e1c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c   if( pParse->col
e1d0: 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e  NamesSet || db->
e1e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
e1f0: 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75  eturn;.  /* Colu
e200: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 64 65 74  mn names are det
e210: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6c  ermined by the l
e220: 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66  eft-most term of
e230: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
e240: 63 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  ct */.  while( p
e250: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
e260: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
e270: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 70 54  ct->pPrior;.  pT
e280: 61 62 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  abList = pSelect
e290: 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
e2a0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
e2b0: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  st;.  assert( v!
e2c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e2d0: 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pTabList!=0 );. 
e2e0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
e2f0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
e300: 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  Name = (db->flag
e310: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
e320: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
e330: 72 63 4e 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c  rcName = (db->fl
e340: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
e350: 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 7c  rtColNames)!=0 |
e360: 7c 20 66 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73 71  | fullName;.  sq
e370: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
e380: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
e390: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
e3a0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
e3b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
e3c0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
e3d0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20  [i].pExpr;..    
e3e0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
e3f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
e400: 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
e410: 20 29 3b 20 20 2f 2a 20 41 67 67 20 70 72 6f 63   );  /* Agg proc
e420: 65 73 73 69 6e 67 20 68 61 73 20 6e 6f 74 20 72  essing has not r
e430: 75 6e 20 79 65 74 20 2a 2f 0a 20 20 20 20 61 73  un yet */.    as
e440: 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f  sert( p->op!=TK_
e450: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54 61  COLUMN || p->pTa
e460: 62 21 3d 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72  b!=0 ); /* Cover
e470: 69 6e 67 20 69 64 78 20 6e 6f 74 20 79 65 74 20  ing idx not yet 
e480: 63 6f 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 28  coded */.    if(
e490: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
e4a0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
e4b0: 41 6e 20 41 53 20 63 6c 61 75 73 65 20 61 6c 77  An AS clause alw
e4c0: 61 79 73 20 74 61 6b 65 73 20 66 69 72 73 74 20  ays takes first 
e4d0: 70 72 69 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20  priority */.    
e4e0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
e4f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
e500: 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  me;.      sqlite
e510: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
e520: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
e530: 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54  ME, zName, SQLIT
e540: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
e550: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 72 63 4e    }else if( srcN
e560: 61 6d 65 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b  ame && p->op==TK
e570: 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
e580: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
e590: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
e5a0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e5b0: 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a  pTab = p->pTab;.
e5c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
e5d0: 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ab!=0 );.      i
e5e0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
e5f0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
e600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
e610: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
e620: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
e630: 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20  >nCol) );.      
e640: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
e650: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f        zCol = "ro
e660: 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid";.      }els
e670: 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  e{.        zCol 
e680: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
e690: 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  l].zName;.      
e6a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c  }.      if( full
e6b0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
e6c0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
e6d0: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
e6e0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e6f0: 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
e700: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b  b->zName, zCol);
e710: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e720: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
e730: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
e740: 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  E, zName, SQLITE
e750: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20  _DYNAMIC);.     
e760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e770: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e780: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e790: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20  AME_NAME, zCol, 
e7a0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
e7b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e7c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
e7d0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69  t char *z = pELi
e7e0: 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a  st->a[i].zSpan;.
e7f0: 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f        z = z==0 ?
e800: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
e810: 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20  db, "column%d", 
e820: 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62  i+1) : sqlite3Db
e830: 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20  StrDup(db, z);. 
e840: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e850: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e860: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
e870: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e880: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67  );.    }.  }.  g
e890: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70  enerateColumnTyp
e8a0: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
e8b0: 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a  ist, pEList);.}.
e8c0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
e8d0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e8e0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
e8f0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
e900: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
e910: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
e920: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
e930: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
e940: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
e950: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
e960: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
e970: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
e980: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
e990: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
e9a0: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
e9b0: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
e9c0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
e9d0: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
e9e0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
e9f0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
ea00: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
ea10: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
ea20: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
ea30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
ea40: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
ea50: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
ea60: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
ea70: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
ea80: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
ea90: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
eaa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eab0: 4d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c  M..**.** The onl
eac0: 79 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  y guarantee that
ead0: 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62   SQLite makes ab
eae0: 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  out column names
eaf0: 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65 0a   is that if the.
eb00: 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e  ** column has an
eb10: 20 41 53 20 63 6c 61 75 73 65 20 61 73 73 69 67   AS clause assig
eb20: 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20  ning it a name, 
eb30: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65  that will be the
eb40: 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54   name used..** T
eb50: 68 61 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  hat is the only 
eb60: 64 6f 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61  documented guara
eb70: 6e 74 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  ntee.  However, 
eb80: 63 6f 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63  countless applic
eb90: 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f  ations.** develo
eba0: 70 65 64 20 6f 76 65 72 20 74 68 65 20 79 65 61  ped over the yea
ebb0: 72 73 20 68 61 76 65 20 6d 61 64 65 20 62 61 73  rs have made bas
ebc0: 65 6c 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e  eless assumption
ebd0: 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e  s about column n
ebe0: 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c  ames.** and will
ebf0: 20 62 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20   break if those 
ec00: 61 73 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e  assumptions chan
ec10: 67 65 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65  ges.  Hence, use
ec20: 20 65 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e   extreme caution
ec30: 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69  .** when modifyi
ec40: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
ec50: 74 6f 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e  to avoid breakin
ec60: 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20  g legacy..**.** 
ec70: 53 65 65 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61  See Also: genera
ec80: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a  teColumnNames().
ec90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
eca0: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
ecb0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
ecc0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ecd0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
ece0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
ecf0: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
ed00: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
ed10: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
ed20: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
ed30: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
ed40: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
ed50: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
ed60: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
ed70: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
ed80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
ed90: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
eda0: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
edb0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
edc0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
edd0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
ede0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
edf0: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
ee00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ee10: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33  counters */.  u3
ee20: 32 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  2 cnt;          
ee30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ee40: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
ee50: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
ee60: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
ee70: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
ee80: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
ee90: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
eea0: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
eeb0: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
eec0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
eed0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
eee0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
eef0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef10: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
ef20: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef40: 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e   Size of name in
ef50: 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61   zName[] */.  Ha
ef60: 73 68 20 68 74 3b 20 20 20 20 20 20 20 20 20 20  sh ht;          
ef70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
ef80: 68 20 74 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d  h table of colum
ef90: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71  n names */..  sq
efa0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 68  lite3HashInit(&h
efb0: 74 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74  t);.  if( pEList
efc0: 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   ){.    nCol = p
efd0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
efe0: 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    aCol = sqlite3
eff0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f000: 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29   sizeof(aCol[0])
f010: 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74  *nCol);.    test
f020: 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b  case( aCol==0 );
f030: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
f040: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
f050: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
f060: 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e  rt( nCol==(i16)n
f070: 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20  Col );.  *pnCol 
f080: 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c  = nCol;.  *paCol
f090: 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28   = aCol;..  for(
f0a0: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
f0b0: 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d  i<nCol && !db->m
f0c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b  allocFailed; i++
f0d0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
f0e0: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
f0f0: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
f100: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
f110: 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
f120: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
f130: 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
f140: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
f150: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
f160: 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
f170: 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
f180: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
f190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
f1a0: 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71  r *pColExpr = sq
f1b0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
f1c0: 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
f1d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
f1e0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
f1f0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
f200: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
f210: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
f220: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
f230: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
f240: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f250: 20 69 66 28 20 28 70 43 6f 6c 45 78 70 72 2d 3e   if( (pColExpr->
f260: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
f270: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
f280: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 0a 20 20  K_AGG_COLUMN).  
f290: 20 20 20 20 20 26 26 20 70 43 6f 6c 45 78 70 72       && pColExpr
f2a0: 2d 3e 70 54 61 62 21 3d 30 20 0a 20 20 20 20 20  ->pTab!=0 .     
f2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
f2c0: 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74  or columns use t
f2d0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e  he column name n
f2e0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
f2f0: 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78  nt iCol = pColEx
f300: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
f310: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
f320: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
f330: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
f340: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
f350: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
f360: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c      zName = iCol
f370: 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c  >=0 ? pTab->aCol
f380: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22  [iCol].zName : "
f390: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
f3a0: 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72  lse if( pColExpr
f3b0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
f3c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
f3d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
f3e0: 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74  pColExpr, EP_Int
f3f0: 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20  Value) );.      
f400: 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78    zName = pColEx
f410: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
f420: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f430: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
f440: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
f450: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
f460: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
f470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
f480: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
f490: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a  .zSpan;.      }.
f4a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
f4b0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61  ame ){.      zNa
f4c0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
f4d0: 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  rDup(db, zName);
f4e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f4f0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
f500: 33 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c  3MPrintf(db,"col
f510: 75 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20  umn%d",i+1);.   
f520: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
f530: 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  sure the column 
f540: 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20  name is unique. 
f550: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   If the name is 
f560: 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20  not unique,.    
f570: 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74  ** append an int
f580: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
f590: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
f5a0: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
f5b0: 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a  */.    cnt = 0;.
f5c0: 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65      while( zName
f5d0: 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46   && sqlite3HashF
f5e0: 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21  ind(&ht, zName)!
f5f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d  =0 ){.      nNam
f600: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
f610: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
f620: 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b    if( nName>0 ){
f630: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e  .        for(j=n
f640: 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73  Name-1; j>0 && s
f650: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
f660: 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a  ame[j]); j--){}.
f670: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
f680: 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[j]==':' ) nNam
f690: 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20  e = j;.      }. 
f6a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
f6b0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
f6c0: 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65  "%.*z:%u", nName
f6d0: 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  , zName, ++cnt);
f6e0: 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33  .      if( cnt>3
f6f0: 20 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f   ) sqlite3_rando
f700: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74  mness(sizeof(cnt
f710: 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a  ), &cnt);.    }.
f720: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
f730: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c  = zName;.    sql
f740: 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72  ite3ColumnProper
f750: 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20  tiesFromName(0, 
f760: 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a  pCol);.    if( z
f770: 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
f780: 61 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a  ashInsert(&ht, z
f790: 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f  Name, pCol)==pCo
f7a0: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
f7b0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
f7c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
f7d0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74  te3HashClear(&ht
f7e0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
f7f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
f800: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
f810: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
f820: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
f830: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
f840: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
f850: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a  Free(db, aCol);.
f860: 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a      *paCol = 0;.
f870: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a      *pnCol = 0;.
f880: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f890: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
f8a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
f8b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
f8c0: 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c  dd type and coll
f8d0: 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  ation informatio
f8e0: 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69  n to a column li
f8f0: 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61  st based on.** a
f900: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f910: 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f  t..** .** The co
f920: 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d  lumn list presum
f930: 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73  ably came from s
f940: 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  electColumnNames
f950: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a  FromExprList()..
f960: 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  ** The column li
f970: 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65  st has only name
f980: 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20  s, not types or 
f990: 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69  collations.  Thi
f9a0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65  s.** routine goe
f9b0: 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64  s through and ad
f9c0: 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64  ds the types and
f9d0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a   collations..**.
f9e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
f9f0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c  requires that al
fa00: 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  l identifiers in
fa10: 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73   the SELECT.** s
fa20: 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f  tatement be reso
fa30: 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lved..*/.void sq
fa40: 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f  lite3SelectAddCo
fa50: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
fa60: 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  tion(.  Parse *p
fa70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
fa80: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
fa90: 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  s */.  Table *pT
faa0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
fab0: 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  Add column type 
fac0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
fad0: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53  his table */.  S
fae0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
faf0: 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75       /* SELECT u
fb00: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
fb10: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
fb20: 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  tions */.){.  sq
fb30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
fb40: 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f  se->db;.  NameCo
fb50: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c  ntext sNC;.  Col
fb60: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c  umn *pCol;.  Col
fb70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
fb80: 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b  nt i;.  Expr *p;
fb90: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
fba0: 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36  st_item *a;.  u6
fbb0: 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20  4 szAll = 0;..  
fbc0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 21  assert( pSelect!
fbd0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fbe0: 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61  (pSelect->selFla
fbf0: 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
fc00: 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
fc10: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53  ( pTab->nCol==pS
fc20: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
fc30: 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  Expr || db->mall
fc40: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
fc50: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
fc60: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  ed ) return;.  m
fc70: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
fc80: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73  izeof(sNC));.  s
fc90: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
fca0: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61  elect->pSrc;.  a
fcb0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
fcc0: 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30  st->a;.  for(i=0
fcd0: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
fce0: 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; i<pTab->nCol;
fcf0: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
fd00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fd10: 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c  Type;.    int n,
fd20: 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d   m;.    p = a[i]
fd30: 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70  .pExpr;.    zTyp
fd40: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
fd50: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
fd60: 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a   &pCol->szEst);.
fd70: 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f      szAll += pCo
fd80: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43  l->szEst;.    pC
fd90: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
fda0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
fdb0: 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  ty(p);.    if( z
fdc0: 54 79 70 65 20 26 26 20 28 6d 20 3d 20 73 71 6c  Type && (m = sql
fdd0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79  ite3Strlen30(zTy
fde0: 70 65 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  pe))>0 ){.      
fdf0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
fe00: 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  n30(pCol->zName)
fe10: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
fe20: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ame = sqlite3DbR
fe30: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c  eallocOrFree(db,
fe40: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b   pCol->zName, n+
fe50: 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+2);.      if( 
fe60: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pCol->zName ){. 
fe70: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
fe80: 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c  Col->zName[n+1],
fe90: 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20   zType, m+1);.  
fea0: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
feb0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
fec0: 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d  HASTYPE;.      }
fed0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
fee0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
fef0: 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
ff00: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
ff10: 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  LOB;.    pColl =
ff20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
ff30: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
ff40: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
ff50: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20   pCol->zColl==0 
ff60: 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
ff70: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
ff80: 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
ff90: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
ffa0: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61    }.  pTab->szTa
ffb0: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
ffc0: 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d  gEst(szAll*4);.}
ffd0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
ffe0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
fff0: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62  , generate a Tab
10000 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
10010 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74  t describes.** t
10020 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
10030 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f   that SELECT..*/
10040 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52  .Table *sqlite3R
10050 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
10060 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
10070 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
10080 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
10090 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
100a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
100b0 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a  nt savedFlags;..
100c0 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64    savedFlags = d
100d0 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e  b->flags;.  db->
100e0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
100f0 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20  _FullColNames;. 
10100 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
10110 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
10120 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  es;.  sqlite3Sel
10130 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
10140 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10150 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
10160 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68  ) return 0;.  wh
10170 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
10180 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d  rior ) pSelect =
10190 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
101a0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20  ;.  db->flags = 
101b0 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54  savedFlags;.  pT
101c0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
101d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
101e0 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20  eof(Table) );.  
101f0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
10200 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
10210 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65  .  /* The sqlite
10220 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
10230 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65  ct() is only use
10240 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65  d n contexts whe
10250 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a  re lookaside.  *
10260 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  * is disabled */
10270 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
10280 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
10290 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54 61  e );.  pTab->nTa
102a0 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  bRef = 1;.  pTab
102b0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
102c0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
102d0 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
102e0 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
102f0 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
10300 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
10310 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
10320 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
10330 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
10340 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
10350 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
10360 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
10370 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
10380 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
10390 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
103a0 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
103b0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
103c0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
103d0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
103e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
103f0 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
10400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
10410 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
10420 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
10430 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
10440 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
10450 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
10460 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
10470 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
10480 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
10490 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
104a0 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
104b0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
104c0 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65  f( pParse->pVdbe
104d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
104e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
104f0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
10500 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20  pToplevel==0.   
10510 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
10520 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e 64  nabled(pParse->d
10530 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f  b,SQLITE_FactorO
10540 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20 20  utConst).  ){.  
10550 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
10560 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20 7d  tFactor = 1;.  }
10570 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
10580 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72  3VdbeCreate(pPar
10590 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  se);.}.../*.** C
105a0 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d 69  ompute the iLimi
105b0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66 69  t and iOffset fi
105c0 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c 45  elds of the SELE
105d0 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  CT based on the.
105e0 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f  ** pLimit and pO
105f0 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  ffset expression
10600 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  s.  pLimit and p
10610 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65 20  Offset hold the 
10620 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
10630 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  hat appear in th
10640 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73  e original SQL s
10650 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74  tatement after t
10660 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
10670 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e  SET.** keywords.
10680 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f    Or NULL if tho
10690 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  se keywords are 
106a0 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20  omitted. iLimit 
106b0 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20  and iOffset .** 
106c0 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  are the integer 
106d0 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20  memory register 
106e0 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e  numbers for coun
106f0 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  ters used to com
10700 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d  pute .** the lim
10710 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20  it and offset.  
10720 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  If there is no l
10730 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73  imit and/or offs
10740 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69  et, then .** iLi
10750 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
10760 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  are negative..**
10770 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
10780 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c   changes the val
10790 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e  ues of iLimit an
107a0 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69  d iOffset only i
107b0 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20  f.** a limit or 
107c0 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e 65  offset is define
107d0 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64 20  d by pLimit and 
107e0 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69 74  pOffset.  iLimit
107f0 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20   and.** iOffset 
10800 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
10810 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72 6f   preset to appro
10820 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20 76  priate default v
10830 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a 20  alues (zero).** 
10840 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
10850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
10860 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65 74  *.** The iOffset
10870 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69 74   register (if it
10880 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69 74   exists) is init
10890 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
108a0 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 4f  alue.** of the O
108b0 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69 6d  FFSET.  The iLim
108c0 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20 69  it register is i
108d0 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
108e0 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a 2a  MIT.  Register.*
108f0 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20 69  * iOffset+1 is i
10900 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c 49  nitialized to LI
10910 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a  MIT+OFFSET..**.*
10920 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
10930 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
10940 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
10950 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
10960 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
10970 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
10980 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
10990 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
109a0 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
109b0 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
109c0 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
109d0 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
109e0 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
109f0 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
10a00 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
10a10 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
10a20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
10a30 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
10a40 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
10a50 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
10a60 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
10a70 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  set;.  int n;.  
10a80 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
10a90 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
10aa0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
10ab0 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
10ac0 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
10ad0 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
10ae0 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
10af0 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
10b00 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
10b10 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
10b20 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
10b30 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
10b40 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
10b50 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
10b60 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
10b70 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
10b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
10b90 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
10ba0 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
10bb0 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
10bc0 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
10bd0 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
10be0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
10bf0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
10c00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
10c10 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
10c20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
10c30 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
10c40 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
10c50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10c60 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
10c70 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
10c80 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
10c90 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
10ca0 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
10cb0 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
10cc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
10cd0 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  o(v, iBreak);.  
10ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
10cf0 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
10d00 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45 73  Row>sqlite3LogEs
10d10 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20 20  t((u64)n) ){.   
10d20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
10d30 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
10d40 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20 20  st((u64)n);.    
10d50 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
10d60 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74  |= SF_FixedLimit
10d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
10d80 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10d90 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10da0 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
10db0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
10dc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10dd0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
10de0 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
10df0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
10e00 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
10e10 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
10e20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10e30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10e40 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
10e50 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
10e60 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
10e70 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73      if( p->pOffs
10e80 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  et ){.      p->i
10e90 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74  Offset = iOffset
10ea0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
10eb0 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  m;.      pParse-
10ec0 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c  >nMem++;   /* Al
10ed0 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20  locate an extra 
10ee0 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d  register for lim
10ef0 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  it+offset */.   
10f00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
10f10 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f  de(pParse, p->pO
10f20 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b  ffset, iOffset);
10f30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10f40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d  beAddOp1(v, OP_M
10f50 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65  ustBeInt, iOffse
10f60 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
10f70 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
10f80 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
10f90 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
10fa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10fb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
10fc0 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74  setLimit, iLimit
10fd0 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69 4f 66  , iOffset+1, iOf
10fe0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  fset);.      Vdb
10ff0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
11000 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
11010 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e     }.  }.}..#ifn
11020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11030 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
11040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11050 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c   appropriate col
11060 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
11070 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20  for the iCol-th 
11080 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65  column of.** the
11090 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20   result set for 
110a0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  the compound-sel
110b0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70  ect statement "p
110c0 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  ".  Return NULL 
110d0 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  if.** the column
110e0 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20   has no default 
110f0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
11100 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  ce..**.** The co
11110 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
11120 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e   for the compoun
11130 64 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65  d select is take
11140 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65  n from the.** le
11150 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ft-most term of 
11160 74 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20  the select that 
11170 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
11180 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  sequence..*/.sta
11190 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c  tic CollSeq *mul
111a0 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
111b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
111c0 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43  elect *p, int iC
111d0 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ol){.  CollSeq *
111e0 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pRet;.  if( p->p
111f0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65  Prior ){.    pRe
11200 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  t = multiSelectC
11210 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
11220 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b  ->pPrior, iCol);
11230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
11240 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  et = 0;.  }.  as
11250 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b  sert( iCol>=0 );
11260 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20  .  /* iCol must 
11270 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e  be less than p->
11280 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20  pEList->nExpr.  
11290 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  Otherwise an err
112a0 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61  or would.  ** ha
112b0 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e 20 64  ve been thrown d
112c0 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c  uring name resol
112d0 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75  ution and we wou
112e0 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f 74 74  ld not have gott
112f0 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 72  en.  ** this far
11300 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   */.  if( pRet==
11310 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
11320 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
11330 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  r) ){.    pRet =
11340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
11350 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
11360 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
11370 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
11380 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
11390 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
113a0 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
113b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
113c0 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f 6d 70  ameter is a comp
113d0 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77  ound SELECT.** w
113e0 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
113f0 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66 75 6e  clause. This fun
11400 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
11410 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 4b 65  and returns a Ke
11420 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  yInfo.** structu
11430 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  re suitable for 
11440 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65  implementing the
11450 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a   ORDER BY..**.**
11460 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
11470 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
11480 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64  ture is obtained
11490 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68   from malloc. Th
114a0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
114b0 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
114c0 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72 69 6e  ible for ensurin
114d0 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
114e0 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
114f0 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
11500 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
11510 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65  *multiSelectOrde
11520 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  rByKeyInfo(Parse
11530 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
11540 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72 61 29   *p, int nExtra)
11550 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  {.  ExprList *pO
11560 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
11570 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  erBy;.  int nOrd
11580 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
11590 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c  By->nExpr;.  sql
115a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
115b0 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f  e->db;.  KeyInfo
115c0 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
115d0 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
115e0 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74 72 61   nOrderBy+nExtra
115f0 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52 65 74  , 1);.  if( pRet
11600 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
11610 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
11620 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
11630 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
11640 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
11650 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  = &pOrderBy->a[i
11660 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ];.      Expr *p
11670 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45  Term = pItem->pE
11680 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  xpr;.      CollS
11690 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  eq *pColl;..    
116a0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
116b0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
116c0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
116d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
116e0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 54  llSeq(pParse, pT
116f0 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  erm);.      }els
11700 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e{.        pColl
11710 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
11720 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
11730 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
11740 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  erByCol-1);.    
11750 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30      if( pColl==0
11760 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
11770 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
11780 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
11790 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  .pExpr =.       
117a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
117b0 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70  dCollateString(p
117c0 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43  Parse, pTerm, pC
117d0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
117e0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
117f0 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
11800 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 52 65  oIsWriteable(pRe
11810 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52 65 74  t) );.      pRet
11820 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
11830 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e  ll;.      pRet->
11840 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
11850 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73  pOrderBy->a[i].s
11860 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
11870 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
11880 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  et;.}..#ifndef S
11890 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f  QLITE_OMIT_CTE./
118a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
118b0 65 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45  e generates VDBE
118c0 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65   code to compute
118d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
118e0 61 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45  a WITH RECURSIVE
118f0 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65  .** query of the
11900 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c   form:.**.**   <
11910 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e  recursive-table>
11920 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72   AS (<setup-quer
11930 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c  y> UNION [ALL] <
11940 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e  recursive-query>
11950 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
11970 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20  _________/      
11980 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f         \________
11990 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 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 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20       p.**.**.** 
119e0 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c 79  There is exactly
119f0 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
11a00 6f 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  o the recursive-
11a10 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
11a20 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72  M clause.** of r
11a30 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20  ecursive-query, 
11a40 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20  marked with the 
11a50 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e  SrcList->a[].fg.
11a60 69 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67  isRecursive flag
11a70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75  ..**.** The setu
11a80 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63  p-query runs onc
11a90 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
11aa0 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20   initial set of 
11ab0 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20  rows that go.** 
11ac0 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62  into a Queue tab
11ad0 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78  le.  Rows are ex
11ae0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
11af0 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65   Queue table one
11b00 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63   by.** one.  Eac
11b10 68 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20  h row extracted 
11b20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75  from Queue is ou
11b30 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20  tput to pDest.  
11b40 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a  Then the single.
11b50 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77  ** extracted row
11b60 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75   (now in the iCu
11b70 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63  rrent table) bec
11b80 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  omes the content
11b90 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72   of the.** recur
11ba0 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61  sive-table for a
11bb0 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11bc0 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75   run.  The outpu
11bd0 74 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  t of the recursi
11be0 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61  ve-query.** is a
11bf0 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  dded back into t
11c00 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
11c10 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f   Then another ro
11c20 77 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  w is extracted f
11c30 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64  rom Queue.** and
11c40 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63   the iteration c
11c50 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74  ontinues until t
11c60 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
11c70 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
11c80 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
11c90 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73  uery operator is
11ca0 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64   UNION then no d
11cb0 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72  uplicate rows ar
11cc0 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74  e ever.** insert
11cd0 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ed into the Queu
11ce0 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44  e table.  The iD
11cf0 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65  istinct table ke
11d00 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c  eps a copy of al
11d10 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68  l rows.** that h
11d20 61 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e  ave ever been in
11d30 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75  serted into Queu
11d40 65 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70  e and causes dup
11d50 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a  licates to be.**
11d60 20 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20   discarded.  If 
11d70 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  the operator is 
11d80 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20  UNION ALL, then 
11d90 64 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61  duplicates are a
11da0 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49  llowed..** .** I
11db0 66 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20  f the query has 
11dc0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
11dd0 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  n entries in the
11de0 20 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65   Queue table are
11df0 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45   kept in.** ORDE
11e00 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74  R BY order and t
11e10 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
11e20 73 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20  s extracted for 
11e30 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74  each cycle.  Wit
11e40 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52  hout.** an ORDER
11e50 20 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74   BY, the Queue t
11e60 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46  able is just a F
11e70 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  IFO..**.** If a 
11e80 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20  LIMIT clause is 
11e90 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74  provided, then t
11ea0 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f  he iteration sto
11eb0 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72  ps after LIMIT r
11ec0 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  ows.** have been
11ed0 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74   output to pDest
11ee0 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65  .  A LIMIT of ze
11ef0 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  ro means to outp
11f00 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61  ut no rows and a
11f10 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d  .** negative LIM
11f20 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70  IT means to outp
11f30 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66  ut all rows.  If
11f40 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   there is also a
11f50 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
11f60 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69  ** with a positi
11f70 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  ve value, then t
11f80 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
11f90 6f 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63  outputs are disc
11fa0 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20  arded rather.** 
11fb0 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20  than being sent 
11fc0 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c  to pDest.  The L
11fd0 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20  IMIT count does 
11fe0 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20  not begin until 
11ff0 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20  after OFFSET.** 
12000 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73  rows have been s
12010 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
12020 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57  c void generateW
12030 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72  ithRecursiveQuer
12040 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
12050 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
12060 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
12070 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
12080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12090 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
120a0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
120b0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
120c0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
120d0 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
120e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
120f0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
12100 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f   p->pSrc;      /
12110 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
12120 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  e of the recursi
12130 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  ve query */.  in
12140 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69  t nCol = p->pELi
12150 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e  st->nExpr;  /* N
12160 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
12170 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76   in the recursiv
12180 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62  e table */.  Vdb
12190 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
121a0 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Vdbe;      /* Th
121b0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
121c0 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74  ment under const
121d0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ruction */.  Sel
121e0 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d  ect *pSetup = p-
121f0 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68  >pPrior;   /* Th
12200 65 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f  e setup query */
12210 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20  .  int addrTop; 
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12230 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
12240 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
12250 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b  rCont, addrBreak
12260 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e  ;      /* CONTIN
12270 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64  UE and BREAK add
12280 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20  resses */.  int 
12290 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  iCurrent = 0;   
122a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
122b0 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
122c0 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65  /.  int regCurre
122d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
122e0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
122f0 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61  lding Current ta
12300 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75  ble */.  int iQu
12310 65 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  eue;            
12320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75         /* The Qu
12330 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
12340 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30  nt iDistinct = 0
12350 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12360 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65  To ensure unique
12370 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f   results if UNIO
12380 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74  N */.  int eDest
12390 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20 20 20   = SRT_Fifo;    
123a0 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77       /* How to w
123b0 72 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f  rite to Queue */
123c0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
123d0 73 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20  stQueue;        
123e0 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74   /* SelectDest t
123f0 61 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75  argetting the Qu
12400 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  eue table */.  i
12410 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12430 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12440 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
12470 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
12480 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20  rderBy;         
12490 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
124a0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  Y clause */.  Ex
124b0 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
124c0 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  fset;       /* S
124d0 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f  aved LIMIT and O
124e0 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72  FFSET */.  int r
124f0 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73  egLimit, regOffs
12500 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69  et;      /* Regi
12510 73 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49  sters used by LI
12520 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
12530 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
12540 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
12550 64 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71  do a recursive q
12560 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71  uery */.  if( sq
12570 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
12580 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
12590 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30  CURSIVE, 0, 0, 0
125a0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f  ) ) return;..  /
125b0 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49  * Process the LI
125c0 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
125d0 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20  lauses, if they 
125e0 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42  exist */.  addrB
125f0 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
12600 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12610 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
12620 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c  = 320;  /* 4 bil
12630 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63  lion rows */.  c
12640 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
12650 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
12660 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c  addrBreak);.  pL
12670 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
12680 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d  ;.  pOffset = p-
12690 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c  >pOffset;.  regL
126a0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
126b0 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
126c0 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
126d0 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66  >pLimit = p->pOf
126e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69  fset = 0;.  p->i
126f0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73  Limit = p->iOffs
12700 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72  et = 0;.  pOrder
12710 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
12720 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  ;..  /* Locate t
12730 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
12740 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74 20   of the Current 
12750 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69  table */.  for(i
12760 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53 72  =0; ALWAYS(i<pSr
12770 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a  c->nSrc); i++){.
12780 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61 5b      if( pSrc->a[
12790 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  i].fg.isRecursiv
127a0 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72  e ){.      iCurr
127b0 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ent = pSrc->a[i]
127c0 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
127d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
127e0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
127f0 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20  cursors numbers 
12800 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69  for Queue and Di
12810 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72  stinct.  The cur
12820 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20  sor number for. 
12830 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74   ** the Distinct
12840 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65   table must be e
12850 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74  xactly one great
12860 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e  er than Queue in
12870 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20   order.  ** for 
12880 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  the SRT_DistFifo
12890 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
128a0 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
128b0 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
128c0 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
128d0 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
128e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
128f0 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
12900 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
12910 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 46  ueue : SRT_DistF
12920 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69 6e  ifo;.    iDistin
12930 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
12940 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b++;.  }else{.  
12950 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72    eDest = pOrder
12960 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20 3a  By ? SRT_Queue :
12970 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a 20   SRT_Fifo;.  }. 
12980 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
12990 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65 75  stInit(&destQueu
129a0 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75 65  e, eDest, iQueue
129b0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
129c0 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75  e cursors for Cu
129d0 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e  rrent, Queue, an
129e0 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20  d Distinct. */. 
129f0 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b   regCurrent = ++
12a00 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
12a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12a20 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
12a30 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65  do, iCurrent, re
12a40 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b  gCurrent, nCol);
12a50 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
12a60 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
12a70 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69  pKeyInfo = multi
12a80 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79  SelectOrderByKey
12a90 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20  Info(pParse, p, 
12aa0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
12ab0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12ac0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12ad0 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d  Queue, pOrderBy-
12ae0 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
12b10 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
12b20 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70  .    destQueue.p
12b30 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12b40 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  By;.  }else{.   
12b50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12b60 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
12b70 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20  emeral, iQueue, 
12b80 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62  nCol);.  }.  Vdb
12b90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75  eComment((v, "Qu
12ba0 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20  eue table"));.  
12bb0 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b  if( iDistinct ){
12bc0 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
12bd0 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65  Ephm[0] = sqlite
12be0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12bf0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
12c00 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a   iDistinct, 0);.
12c10 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
12c20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
12c30 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ral;.  }..  /* D
12c40 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  etach the ORDER 
12c50 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  BY clause from t
12c60 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
12c70 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  CT */.  p->pOrde
12c80 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53  rBy = 0;..  /* S
12c90 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
12ca0 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75   of the setup-qu
12cb0 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f  ery in Queue. */
12cc0 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74  .  pSetup->pNext
12cd0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
12ce0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12cf0 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65 73 74  e, pSetup, &dest
12d00 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74 75 70  Queue);.  pSetup
12d10 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69  ->pNext = p;.  i
12d20 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
12d30 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75  _of_recursive_qu
12d40 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ery;..  /* Find 
12d50 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
12d60 74 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75  the Queue and ou
12d70 74 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f  tput that row */
12d80 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  .  addrTop = sql
12d90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12da0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75  , OP_Rewind, iQu
12db0 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  eue, addrBreak);
12dc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
12dd0 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  ;..  /* Transfer
12de0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e   the next row in
12df0 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43   Queue over to C
12e00 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  urrent */.  sqli
12e10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12e20 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75   OP_NullRow, iCu
12e30 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65  rrent); /* To re
12e40 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  set column cache
12e50 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
12e60 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
12e70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12e80 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65  P_Column, iQueue
12e90 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
12ea0 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74 29  r+1, regCurrent)
12eb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
12ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12ed0 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20  (v, OP_RowData, 
12ee0 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72 65  iQueue, regCurre
12ef0 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
12f00 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12f10 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65 75  OP_Delete, iQueu
12f20 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  e);..  /* Output
12f30 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20   the single row 
12f40 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  in Current */.  
12f50 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
12f60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
12f70 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65 74  v);.  codeOffset
12f80 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20 61  (v, regOffset, a
12f90 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65  ddrCont);.  sele
12fa0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
12fb0 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e 74 2c  se, p, iCurrent,
12fc0 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65  .      0, 0, pDe
12fd0 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  st, addrCont, ad
12fe0 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
12ff0 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  regLimit ){.    
13000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13010 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
13020 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20  Zero, regLimit, 
13030 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
13040 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
13050 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
13060 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
13070 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20  , addrCont);..  
13080 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72  /* Execute the r
13090 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
130a0 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c  taking the singl
130b0 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74  e row in Current
130c0 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c   as.  ** the val
130d0 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72  ue for the recur
130e0 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72  sive-table. Stor
130f0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
13100 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f   the Queue..  */
13110 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
13120 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
13130 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
13140 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13150 20 22 72 65 63 75 72 73 69 76 65 20 61 67 67 72   "recursive aggr
13160 65 67 61 74 65 20 71 75 65 72 69 65 73 20 6e 6f  egate queries no
13170 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  t supported");. 
13180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70   }else{.    p->p
13190 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  Prior = 0;.    s
131a0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
131b0 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
131c0 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ue);.    assert(
131d0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
131e0 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
131f0 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20   pSetup;.  }..  
13200 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20  /* Keep running 
13210 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74  the loop until t
13220 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74  he Queue is empt
13230 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
13240 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  beGoto(v, addrTo
13250 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  p);.  sqlite3Vdb
13260 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13270 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e   addrBreak);..en
13280 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
13290 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45  uery:.  sqlite3E
132a0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
132b0 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72  arse->db, p->pOr
132c0 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72  derBy);.  p->pOr
132d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
132e0 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
132f0 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66  pLimit;.  p->pOf
13300 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
13310 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
13320 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
13330 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  T_CTE */../* For
13340 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
13350 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
13360 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
13370 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13380 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
13390 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
133a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
133b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
133c0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
133d0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
133e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
133f0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
13400 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
13410 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
13420 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  );../*.** Handle
13430 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
13440 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  e of a compound-
13450 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67  select that orig
13460 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a  inates from a.**
13470 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20   VALUES clause. 
13480 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69   By handling thi
13490 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  s as a special c
134a0 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65  ase, we avoid de
134b0 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c  ep.** recursion,
134c0 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74   and thus do not
134d0 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65   need to enforce
134e0 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
134f0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
13500 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53  T.** on a VALUES
13510 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42   clause..**.** B
13520 65 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63  ecause the Selec
13530 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61  t object origina
13540 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45  tes from a VALUE
13550 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28  S clause:.**   (
13560 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d  1) It has no LIM
13570 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20  IT or OFFSET.** 
13580 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
13590 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
135a0 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
135b0 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
135c0 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
135d0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
135e0 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
135f0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
13600 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13610 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
13620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13630 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
13640 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
13650 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
13660 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
13670 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
13680 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
13690 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  /.){.  Select *p
136a0 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f  Prior;.  int nRo
136b0 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20  w = 1;.  int rc 
136c0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
136d0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
136e0 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a 20 20  MultiValue );.  
136f0 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  do{.    assert( 
13700 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13710 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20 20 61  _Values );.    a
13720 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
13730 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d  _ALL || (p->op==
13740 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70 2d 3e  TK_SELECT && p->
13750 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20  pPrior==0) );.  
13760 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
13770 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  mit==0 );.    as
13780 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
13790 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
137a0 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c  t( p->pNext==0 |
137b0 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
137c0 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45  pr==p->pNext->pE
137d0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
137e0 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72     if( p->pPrior
137f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
13800 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
13810 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a  or->pNext==p );.
13820 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
13830 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20  r;.    nRow++;. 
13840 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20 77 68   }while(1);.  wh
13850 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 50  ile( p ){.    pP
13860 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
13870 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
13880 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
13890 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
138a0 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
138b0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
138c0 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 72  Prior;.    if( r
138d0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  c ) break;.    p
138e0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
138f0 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  Row;.    p = p->
13900 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pNext;.  }.  ret
13910 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
13930 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
13940 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
13950 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
13960 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
13970 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
13980 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
13990 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
139a0 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
139b0 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
139c0 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
139d0 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
139e0 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
139f0 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
13a00 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
13a10 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
13a20 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
13a30 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
13a40 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
13a50 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
13a60 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
13a70 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
13a80 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
13a90 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
13aa0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
13ab0 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
13ac0 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
13ad0 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
13ae0 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
13af0 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
13b00 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
13b10 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
13b20 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
13b30 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
13b40 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
13b50 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
13b60 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
13b70 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
13b80 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
13b90 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
13ba0 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
13bb0 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
13bc0 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
13bd0 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
13be0 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
13bf0 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
13c00 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
13c10 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
13c20 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
13c30 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
13c40 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
13c50 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
13c60 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
13c70 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
13c80 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
13c90 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
13ca0 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
13cb0 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
13cc0 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
13cd0 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
13ce0 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
13cf0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
13d00 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
13d10 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
13d20 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
13d30 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
13d40 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
13d50 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
13d60 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
13d70 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
13d80 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
13d90 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
13da0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
13db0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
13dc0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
13dd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13de0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
13df0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
13e00 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
13e10 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
13e20 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
13e30 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
13e40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
13e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
13e60 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
13e70 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
13e80 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
13e90 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
13ea0 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
13eb0 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
13ec0 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
13ed0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
13ee0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13ef0 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
13f00 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
13f10 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
13f20 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
13f30 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
13f40 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
13f50 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
13f60 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
13f70 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
13f80 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
13f90 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
13fa0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
13fb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13fc0 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
13fd0 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20  iSub1 = 0;      
13fe0 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
13ff0 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
14000 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20  /.  int iSub2 = 
14010 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50  0;        /* EQP
14020 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
14030 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
14040 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
14050 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
14060 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
14070 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
14080 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
14090 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
140a0 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
140b0 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
140c0 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
140d0 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
140e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
140f0 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
14100 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
14110 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
14120 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
14130 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
14140 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
14150 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
14160 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
14170 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
14180 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14190 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
141a0 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a  rior;.  dest = *
141b0 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72  pDest;.  if( pPr
141c0 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c  ior->pOrderBy ||
141d0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
141e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
141f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
14200 73 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  s clause should 
14210 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
14220 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
14230 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
14240 79 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59  y!=0 ? "ORDER BY
14250 22 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c  " : "LIMIT", sel
14260 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
14270 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  );.    rc = 1;. 
14280 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
14290 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
142a0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
142b0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
142c0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
142d0 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65  /* The VDBE alre
142e0 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63  ady created by c
142f0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
14300 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  */..  /* Create 
14310 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
14320 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14330 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a  if necessary.  *
14340 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65  /.  if( dest.eDe
14350 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
14360 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14370 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
14380 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14390 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
143a0 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44  emeral, dest.iSD
143b0 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  Parm, p->pEList-
143c0 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73  >nExpr);.    des
143d0 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
143e0 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ble;.  }..  /* S
143f0 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20  pecial handling 
14400 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  for a compound-s
14410 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
14420 6e 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45  nates as a VALUE
14430 53 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  S clause..  */. 
14440 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
14450 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
14460 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c   ){.    rc = mul
14470 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70  tiSelectValues(p
14480 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29  Parse, p, &dest)
14490 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
144a0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
144b0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
144c0 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20   all SELECTs in 
144d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61  the statement ha
144e0 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
144f0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20  er of elements. 
14500 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73   ** in their res
14510 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20  ult sets..  */. 
14520 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
14530 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45  st && pPrior->pE
14540 4c 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74  List );.  assert
14550 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
14560 70 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69  pr==pPrior->pELi
14570 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69  st->nExpr );..#i
14580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14590 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73  T_CTE.  if( p->s
145a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
145b0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65  ursive ){.    ge
145c0 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
145d0 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c  iveQuery(pParse,
145e0 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65   p, &dest);.  }e
145f0 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  lse.#endif..  /*
14600 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
14610 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
14620 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
14630 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
14640 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
14650 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
14660 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
14670 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
14680 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
14690 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
146a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
146b0 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
146c0 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
146d0 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
146e0 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
146f0 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
14700 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
14710 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
14720 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
14730 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
14740 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
14750 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
14760 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20   p->iLimit;.    
14770 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
14780 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
14790 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
147a0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
147b0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
147c0 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
147d0 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c  fset;.      expl
147e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
147f0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
14800 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
14810 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
14820 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
14830 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
14840 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
14850 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  0;.      p->pOff
14860 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
14870 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14880 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
14890 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
148a0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
148b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  = 0;.      p->iL
148c0 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
148d0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
148e0 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
148f0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
14900 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
14910 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
14920 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14930 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
14940 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
14950 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
14960 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
14970 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
14980 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
14990 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d"));.        if
149a0 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a  ( p->iOffset ){.
149b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
149c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
149d0 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20  P_OffsetLimit,. 
149e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149f0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4c             p->iL
14a00 69 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74  imit, p->iOffset
14a10 2b 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b  +1, p->iOffset);
14a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14a30 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
14a40 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
14a50 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
14a60 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
14a70 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
14a80 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
14a90 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
14aa0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14ab0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
14ac0 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
14ad0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
14ae0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
14af0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
14b00 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
14b10 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
14b20 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
14b30 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28  tRow);.      if(
14b40 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
14b50 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
14b60 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
14b70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
14b80 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
14b90 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
14ba0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
14bb0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
14bc0 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
14bd0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53  ){.        p->nS
14be0 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
14bf0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c  e3LogEst((u64)nL
14c00 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
14c10 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
14c20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14c30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14c40 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
14c50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14c60 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
14c70 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
14c80 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
14c90 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
14ca0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
14cb0 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
14cc0 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
14cd0 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
14ce0 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20    u8 op = 0;    
14cf0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
14d00 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
14d10 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
14d20 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
14d30 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
14d40 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
14d50 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
14d60 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
14d70 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
14d80 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
14d90 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
14da0 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
14db0 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
14dc0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
14dd0 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
14de0 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74  ondest;..      t
14df0 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
14e00 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20  TK_EXCEPT );.   
14e10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14e20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
14e30 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20        priorOp = 
14e40 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
14e50 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
14e60 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
14e70 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
14e80 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
14e90 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
14ea0 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
14eb0 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69  ur.        ** ri
14ec0 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ght..        */.
14ed0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14ee0 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20  p->pLimit==0 ); 
14ef0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
14f00 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
14f10 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
14f20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14f30 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  Offset==0 );    
14f40 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20   /* Not allowed 
14f50 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d  on leftward elem
14f60 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
14f70 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e  unionTab = dest.
14f80 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d  iSDParm;.      }
14f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
14fa0 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
14fb0 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
14fc0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
14fd0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
14fe0 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69      ** intermedi
14ff0 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20  ate results..   
15000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
15010 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73  unionTab = pPars
15020 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
15030 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
15040 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
15050 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
15060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15070 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
15080 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b  l, unionTab, 0);
15090 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
150a0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
150b0 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20  [0] == -1 );.   
150c0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
150d0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
150e0 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
150f0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
15100 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
15110 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
15120 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15130 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  t );.      }..  
15140 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
15150 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
15160 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20  s to our left.  
15170 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
15180 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f  ert( !pPrior->pO
15190 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
151a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
151b0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
151c0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
151d0 54 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  Tab);.      expl
151e0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
151f0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
15200 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
15210 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
15220 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
15230 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
15240 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
15250 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
15260 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
15270 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15280 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
15290 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
152a0 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  ement.      */. 
152b0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
152c0 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20  TK_EXCEPT ){.   
152d0 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
152e0 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  cept;.      }els
152f0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
15300 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  t( p->op==TK_UNI
15310 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70  ON );.        op
15320 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
15330 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70      }.      p->p
15340 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
15350 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
15360 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
15370 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
15380 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
15390 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
153a0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
153b0 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73    uniondest.eDes
153c0 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78  t = op;.      ex
153d0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
153e0 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
153f0 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
15400 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15410 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
15420 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
15430 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
15450 0a 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20  .      /* Query 
15460 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71  flattening in sq
15470 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69  lite3Select() mi
15480 67 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f  ght refill p->pO
15490 72 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a  rderBy..      **
154a0 20 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65   Be sure to dele
154b0 74 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20  te p->pOrderBy, 
154c0 74 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76  therefore, to av
154d0 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61  oid a memory lea
154e0 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  k. */.      sqli
154f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15500 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
15510 79 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74  y);.      pDelet
15520 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
15530 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
15540 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70   pPrior;.      p
15550 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
15560 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
15570 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
15580 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
15590 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
155a0 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
155b0 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
155c0 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
155d0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
155e0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
155f0 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >pLimit);.      
15600 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  p->pLimit = pLim
15610 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  it;.      p->pOf
15620 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
15630 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
15640 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  = 0;.      p->iO
15650 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20  ffset = 0;..    
15660 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
15670 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
15680 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
15690 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
156a0 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
156b0 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
156c0 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a   need..      */.
156d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e        assert( un
156e0 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44  ionTab==dest.iSD
156f0 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65  Parm || dest.eDe
15700 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20  st!=priorOp );. 
15710 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
15720 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est!=priorOp ){.
15730 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
15740 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
15750 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
15760 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
15770 20 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d          iBreak =
15780 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
15790 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
157a0 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65    iCont = sqlite
157b0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
157c0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75  );.        compu
157d0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
157e0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
157f0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
15800 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15810 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69  , OP_Rewind, uni
15820 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20  onTab, iBreak); 
15830 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15840 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
15850 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15860 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
15870 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
15880 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15890 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158b0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
158c0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
158d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
158e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
158f0 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
15900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15910 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15920 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
15930 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15940 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
15950 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
15960 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
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 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
159a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
159b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
159c0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
159d0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
159e0 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
159f0 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
15a00 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
15a10 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
15a20 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
15a30 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
15a40 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
15a50 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
15a60 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
15a70 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
15a80 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
15a90 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
15aa0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
15ab0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
15ac0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
15ad0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
15ae0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
15af0 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
15b00 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
15b10 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
15b20 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
15b30 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
15b40 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
15b50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
15b60 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
15b70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
15b80 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
15b90 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
15ba0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
15bb0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
15bc0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
15bd0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
15be0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
15bf0 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
15c00 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
15c10 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
15c20 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
15c30 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
15c40 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
15c50 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
15c60 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
15c70 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
15c80 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
15c90 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
15ca0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
15cb0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
15cc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
15cd0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
15ce0 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
15cf0 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
15d00 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
15d10 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
15d20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
15d30 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
15d40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15d50 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
15d60 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
15d70 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
15d80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
15d90 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
15da0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
15db0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
15dc0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
15dd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
15de0 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
15df0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
15e00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15e10 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15e20 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
15e30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
15e40 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
15e50 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
15e60 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
15e70 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
15e80 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
15e90 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
15ea0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
15eb0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
15ec0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
15ed0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
15ee0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
15ef0 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
15f00 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
15f10 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
15f20 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
15f30 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
15f40 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
15f50 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
15f60 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
15f70 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
15f80 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
15f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15fa0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
15fb0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
15fc0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
15fd0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
15fe0 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
15ff0 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
16000 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
16010 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
16020 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
16030 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
16040 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
16050 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
16060 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
16070 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
16080 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
16090 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
160a0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
160b0 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
160c0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
160d0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
160e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
160f0 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
16100 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
16110 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16120 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74  (v);.      iCont
16130 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16140 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
16150 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
16160 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
16170 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  p, iBreak);.    
16180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16190 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
161a0 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b  , tab1, iBreak);
161b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
161c0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
161d0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
161e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
161f0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
16200 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
16210 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72 31  owData, tab1, r1
16220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
16230 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
16240 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61   OP_NotFound, ta
16250 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30  b2, iCont, r1, 0
16260 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16270 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16280 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
16290 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
162a0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
162b0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61  op(pParse, p, ta
162c0 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b1,.            
162d0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
162e0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
162f0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
16300 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
16310 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
16320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
16340 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
16350 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16360 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
16370 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
16380 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
16390 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
163a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp2(v, OP_Clos
163b0 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  e, tab2, 0);.   
163c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
163d0 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
163e0 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
163f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16400 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d   }..  explainCom
16410 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
16420 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
16430 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  b2, p->op!=TK_AL
16440 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  L);..  /* Comput
16450 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
16460 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20  ences used by . 
16470 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61   ** temporary ta
16480 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69  bles needed to i
16490 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d  mplement the com
164a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
164b0 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65  ** Attach the Ke
164c0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
164d0 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79  to all temporary
164e0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
164f0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
16500 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69  is run by the ri
16510 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  ght-most SELECT 
16520 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a  statement only..
16530 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
16540 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65  ements to the le
16550 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74  ft always skip t
16560 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72  his part.  The r
16570 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53  ight-most.  ** S
16580 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f  ELECT might also
16590 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20   skip this part 
165a0 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44  if it has no ORD
165b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
165c0 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61  .  ** no temp ta
165d0 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65  bles are require
165e0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
165f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
16600 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a  sesEphemeral ){.
16610 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16640 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f  r */.    KeyInfo
16650 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20   *pKeyInfo;     
16660 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
16670 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
16680 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
16690 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  */.    Select *p
166a0 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  Loop;           
166b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
166c0 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45  ing through SELE
166d0 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  CT statements */
166e0 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61  .    CollSeq **a
166f0 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
16700 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
16710 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e  g through pKeyIn
16720 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20  fo->aColl[] */. 
16730 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20     int nCol;    
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16750 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
16760 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
16770 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  set */..    asse
16780 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20  rt( p->pNext==0 
16790 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 2d  );.    nCol = p-
167a0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
167b0 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73      pKeyInfo = s
167c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
167d0 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b  oc(db, nCol, 1);
167e0 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49 6e  .    if( !pKeyIn
167f0 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fo ){.      rc =
16800 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
16810 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
16820 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
16830 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
16840 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
16850 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
16860 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
16870 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
16880 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
16890 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
168a0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
168b0 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
168c0 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
168d0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
168e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
168f0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
16900 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
16910 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
16920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
16930 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
16940 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
16950 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
16960 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
16970 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
16980 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
16990 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
169a0 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
169b0 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
169c0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
169d0 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
169e0 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
169f0 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
16a00 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
16a10 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
16a20 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
16a30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
16a40 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
16a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16a60 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
16a70 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
16a80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16a90 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
16aa0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
16ab0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
16ac0 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16af0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64        pLoop->add
16b00 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d  rOpenEphm[i] = -
16b10 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16b20 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49  .    sqlite3KeyI
16b30 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66  nfoUnref(pKeyInf
16b40 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73  o);.  }..multi_s
16b50 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65  elect_end:.  pDe
16b60 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74  st->iSdst = dest
16b70 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d  .iSdst;.  pDest-
16b80 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53  >nSdst = dest.nS
16b90 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  dst;.  sqlite3Se
16ba0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
16bb0 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72  Delete);.  retur
16bc0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
16bd0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
16be0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
16bf0 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d 65  ../*.** Error me
16c00 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20 74  ssage for when t
16c10 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73  wo or more terms
16c20 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
16c30 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66 65  elect have diffe
16c40 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65 73  rent.** size res
16c50 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69  ult sets..*/.voi
16c60 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  d sqlite3SelectW
16c70 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f  rongNumTermsErro
16c80 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
16c90 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
16ca0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
16cb0 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20   SF_Values ){.  
16cc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
16cd0 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56  g(pParse, "all V
16ce0 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65 20  ALUES must have 
16cf0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
16d00 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d 65  of terms");.  }e
16d10 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
16d20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16d30 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65   "SELECTs to the
16d40 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16d50 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20 64  of %s".      " d
16d60 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
16d70 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
16d80 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
16d90 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
16da0 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  p));.  }.}../*.*
16db0 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74  * Code an output
16dc0 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   subroutine for 
16dd0 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c  a coroutine impl
16de0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a  ementation of a.
16df0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65  ** SELECT statme
16e00 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61  nt..**.** The da
16e10 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20  ta to be output 
16e20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  is contained in 
16e30 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  pIn->iSdst.  The
16e40 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
16e50 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  Sdst columns to 
16e60 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73  be output.  pDes
16e70 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f  t is where the o
16e80 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  utput should.** 
16e90 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72  be sent..**.** r
16ea0 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20  egReturn is the 
16eb0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65  number of the re
16ec0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
16ed0 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a  he subroutine.**
16ee0 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e   return address.
16ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65  .**.** If regPre
16f00 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 74  v>0 then it is t
16f10 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
16f20 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68  r in a vector th
16f30 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68  at.** records th
16f40 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  e previous outpu
16f50 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d  t.  mem[regPrev]
16f60 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74 20   is a flag that 
16f70 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74  is false.** if t
16f80 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f  here has been no
16f90 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
16fa0 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  .  If regPrev>0 
16fb0 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20  then code is.** 
16fc0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70  generated to sup
16fd0 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73  press duplicates
16fe0 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75  .  pKeyInfo is u
16ff0 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  sed for comparin
17000 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a  g.** keys..**.**
17010 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f   If the LIMIT fo
17020 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74  und in p->iLimit
17030 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d   is reached, jum
17040 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  p immediately to
17050 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73  .** iBreak..*/.s
17060 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61  tatic int genera
17070 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
17080 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ne(.  Parse *pPa
17090 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
170a0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
170b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170d0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
170e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
170f0 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20  tDest *pIn,     
17100 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20     /* Coroutine 
17110 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a  supplying data *
17120 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
17130 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57  pDest,      /* W
17140 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65  here to send the
17150 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72   data */.  int r
17160 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20  egReturn,       
17170 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
17180 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
17190 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  r */.  int regPr
171a0 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev,            /
171b0 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c  * Previous resul
171c0 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20  t register.  No 
171d0 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30 20  uniqueness if 0 
171e0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
171f0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20  eyInfo,      /* 
17200 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69  For comparing wi
17210 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  th previous entr
17220 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  y */.  int iBrea
17230 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
17240 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 77  * Jump here if w
17250 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54 20  e hit the LIMIT 
17260 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
17270 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
17280 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
17290 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a 20  ;.  int addr;.. 
172a0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
172b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
172c0 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20 3d  );.  iContinue =
172d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
172e0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
172f0 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63 61  Suppress duplica
17300 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20 45  tes for UNION, E
17310 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
17320 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66 28  SECT .  */.  if(
17330 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20 20   regPrev ){.    
17340 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72 32  int addr1, addr2
17350 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73 71  ;.    addr1 = sq
17360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
17370 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
17380 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65 72  Prev); VdbeCover
17390 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64 72  age(v);.    addr
173a0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
173b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
173c0 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  are, pIn->iSdst,
173d0 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d   regPrev+1, pIn-
173e0 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20  >nSdst,.        
173f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17400 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
17410 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
17420 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59  KeyInfo), P4_KEY
17430 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
17440 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
17450 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b 32  OP_Jump, addr2+2
17460 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64 64  , iContinue, add
17470 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65 72  r2+2); VdbeCover
17480 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
17490 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
174a0 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73  v, addr1);.    s
174b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
174c0 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e  (v, OP_Copy, pIn
174d0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
174e0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31  +1, pIn->nSdst-1
174f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17500 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
17510 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72  nteger, 1, regPr
17520 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ev);.  }.  if( p
17530 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
17540 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
17550 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65   0;..  /* Suppre
17560 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46  ss the first OFF
17570 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74  SET entries if t
17580 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45  here is an OFFSE
17590 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  T clause.  */.  
175a0 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
175b0 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69  >iOffset, iConti
175c0 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  nue);..  assert(
175d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
175e0 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20 61  RT_Exists );.  a
175f0 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
17600 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29  est!=SRT_Table )
17610 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65 73  ;.  switch( pDes
17620 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20 20  t->eDest ){.    
17630 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
17640 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
17650 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
17660 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17670 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
17680 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
17690 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
176a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
176b0 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33  int r2 = sqlite3
176c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
176d0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
176e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
176f0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
17700 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
17710 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20  Sdst, r1);.     
17720 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17730 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
17740 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
17750 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  m, r2);.      sq
17760 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17770 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44  v, OP_Insert, pD
17780 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31  est->iSDParm, r1
17790 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
177a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
177b0 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
177c0 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  D);.      sqlite
177d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
177e0 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
177f0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17800 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17810 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
17820 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
17830 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
17840 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
17850 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
17860 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
17870 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
17880 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
17890 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
178a0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
178b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
178c0 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a 20  In->nSdst>1 );. 
178d0 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
178e0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
178f0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
17900 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
17910 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
17920 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
17930 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20 20  nSdst, .        
17940 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41 66    r1, pDest->zAf
17950 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  fSdst, pIn->nSds
17960 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
17970 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
17980 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
17990 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
179a0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
179b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
179c0 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
179d0 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  sert, pDest->iSD
179e0 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20 20  Parm, r1,.      
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74 2c       pIn->iSdst,
17a10 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17a20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
17a30 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17a40 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
17a50 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
17a60 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
17a70 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
17a80 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
17a90 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
17aa0 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
17ab0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
17ac0 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
17ad0 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
17ae0 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
17af0 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
17b00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
17b10 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
17b20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
17b30 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73 65  dst==1 || pParse
17b40 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65 73  ->nErr>0 );  tes
17b50 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73  tcase( pIn->nSds
17b60 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  t!=1 );.      sq
17b70 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
17b80 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
17b90 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44  Sdst, pDest->iSD
17ba0 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  Parm, 1);.      
17bb0 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
17bc0 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
17bd0 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
17be0 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
17bf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
17c00 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
17c10 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
17c20 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  Y */..    /* The
17c30 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f   results are sto
17c40 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63  red in a sequenc
17c50 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20  e of registers. 
17c60 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
17c70 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20  t pDest->iSdst. 
17c80 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75   Then the co-rou
17c90 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20  tine yields..   
17ca0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17cb0 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20  _Coroutine: {.  
17cc0 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69      if( pDest->i
17cd0 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Sdst==0 ){.     
17ce0 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
17cf0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
17d00 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  Range(pParse, pI
17d10 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17d20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
17d30 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20  = pIn->nSdst;.  
17d40 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
17d50 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
17d60 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17d70 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  st, pDest->iSdst
17d80 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
17d90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17da0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
17db0 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
17dc0 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
17dd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17de0 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61  If none of the a
17df0 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72  bove, then the r
17e00 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f  esult destinatio
17e10 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a  n must be.    **
17e20 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68   SRT_Output.  Th
17e30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
17e40 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
17e50 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  any other.    **
17e60 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68   destination oth
17e70 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73  er than the ones
17e80 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f   handled above o
17e90 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20  r SRT_Output..  
17ea0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20    **.    ** For 
17eb0 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75  SRT_Output, resu
17ec0 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
17ed0 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
17ee0 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20  registers.  .   
17ef0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f   ** Then the OP_
17f00 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65  ResultRow opcode
17f10 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75 73   is used to caus
17f20 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
17f30 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72   to.    ** retur
17f40 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f  n the next row o
17f50 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f  f result..    */
17f60 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
17f70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
17f80 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
17f90 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
17fa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17fb0 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
17fc0 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  w, pIn->iSdst, p
17fd0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
17fe0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
17ff0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
18000 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
18010 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  dst, pIn->nSdst)
18020 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18030 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a     }.  }..  /* J
18040 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
18050 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
18060 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
18070 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
18080 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
18090 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
180a0 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70  2(v, OP_DecrJump
180b0 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
180c0 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
180d0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a  verage(v);.  }..
180e0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
180f0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
18100 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
18110 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18120 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29  el(v, iContinue)
18130 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18140 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
18150 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a  rn, regReturn);.
18160 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
18170 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61  }../*.** Alterna
18180 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65  tive compound se
18190 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61  lect code genera
181a0 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77 68  tor for cases wh
181b0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  en there.** is a
181c0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
181d0 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  e..**.** We assu
181e0 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  me a query of th
181f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
18200 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65  :.**.**      <se
18210 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f  lectA>  <operato
18220 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f  r>  <selectB>  O
18230 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79  RDER BY <orderby
18240 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65  list>.**.** <ope
18250 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66  rator> is one of
18260 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f   UNION ALL, UNIO
18270 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
18280 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69 64  TERSECT.  The id
18290 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65  ea.** is to code
182a0 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20   both <selectA> 
182b0 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69  and <selectB> wi
182c0 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
182d0 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d  clause as.** co-
182e0 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20  routines.  Then 
182f0 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69  run the co-routi
18300 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20  nes in parallel 
18310 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72 65  and merge the re
18320 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68  sults.** into th
18330 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64  e output.  In ad
18340 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77  dition to the tw
18350 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61  o coroutines (ca
18360 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64  lled selectA and
18370 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65  .** selectB) the
18380 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75 74  re are 7 subrout
18390 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f  ines:.**.**    o
183a0 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65  utA:    Move the
183b0 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73   output of the s
183c0 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65  electA coroutine
183d0 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
183e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
183f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
18400 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  query..**.**    
18410 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68  outB:    Move th
18420 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
18430 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e  selectB coroutin
18440 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
18450 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
18460 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
18470 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67   query.  (Only g
18480 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49  enerated for UNI
18490 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ON and.**       
184a0 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e        UNION ALL.
184b0 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53    EXCEPT and INS
184c0 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75  ERTSECT never ou
184d0 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a  tput a row that.
184e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 61  **             a
184f0 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42  ppears only in B
18500 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42  .).**.**    AltB
18510 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
18520 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
18530 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
18540 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a  nes and A<B..**.
18550 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20 43  **    AeqB:    C
18560 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
18570 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
18580 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
18590 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  d A==B..**.**   
185a0 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AgtB:    Called
185b0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
185c0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
185d0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42  routines and A>B
185e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a  ..**.**    EofA:
185f0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
18600 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
18610 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a  d from selectA..
18620 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20  **.**    EofB:  
18630 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
18640 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
18650 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a  from selectB..**
18660 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
18670 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61  tation of the la
18680 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f 75  tter five subrou
18690 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20  tines depend on 
186a0 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61  which .** <opera
186b0 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a  tor> is used:.**
186c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
186d0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20     UNION ALL    
186e0 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20       UNION      
186f0 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20 20        EXCEPT    
18700 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a        INTERSECT.
18710 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  **          ----
18720 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d  ---------  -----
18730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
18740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d  ------------  --
18750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
18760 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74  **   AltB:   out
18770 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
18780 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
18790 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
187a0 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20      nextA.**.** 
187b0 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20    AeqB:   outA, 
187c0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
187d0 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20 20  xtA             
187e0 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f 75  nextA         ou
187f0 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20  tA, nextA.**.** 
18800 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20    AgtB:   outB, 
18810 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c  nextB      outB,
18820 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
18830 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20 20  nextB           
18840 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45   nextB.**.**   E
18850 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78  ofA:   outB, nex
18860 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65  tB      outB, ne
18870 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61 6c  xtB          hal
18880 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68 61  t             ha
18890 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a  lt.**.**   EofB:
188a0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
188b0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
188c0 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
188d0 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a  A         halt.*
188e0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42  *.** In the AltB
188f0 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42  , AeqB, and AgtB
18900 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e   subroutines, an
18910 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77   EOF on A follow
18920 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75  ing nextA.** cau
18930 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  ses an immediate
18940 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e   jump to EofA an
18950 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f  d an EOF on B fo
18960 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61  llowing nextB ca
18970 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64  uses.** an immed
18980 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66  iate jump to Eof
18990 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20  B.  Within EofA 
189a0 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f  and EofB, and EO
189b0 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a  F on entry or.**
189c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58   following nextX
189d0 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74   causes a jump t
189e0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
189f0 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69   select processi
18a00 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63  ng..**.** Duplic
18a10 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74  ate removal in t
18a20 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  he UNION, EXCEPT
18a30 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20  , and INTERSECT 
18a40 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64  cases is handled
18a50 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f  .** within the o
18a60 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
18a70 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20 72  .  The regPrev r
18a80 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64  egister set hold
18a90 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  s the previously
18aa0 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65  .** output value
18ab0 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20  .  A comparison 
18ac0 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20  is made against 
18ad0 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74  this value and t
18ae0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20  he output.** is 
18af0 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 6e  skipped if the n
18b00 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c  ext results woul
18b10 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  d be the same as
18b20 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a   the previous..*
18b30 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
18b40 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20  ntation plan is 
18b50 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
18b60 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20   two coroutines 
18b70 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62  and seven.** sub
18b80 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20  routines first, 
18b90 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e  then put the con
18ba0 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68  trol logic at th
18bb0 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20  e bottom.  Like 
18bc0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
18bd0 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a       goto Init.*
18be0 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75  *     coA: corou
18bf0 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75  tine for left qu
18c00 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63  ery (A).**     c
18c10 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oB: coroutine fo
18c20 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28 42  r right query (B
18c30 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75  ).**    outA: ou
18c40 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
18c50 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75  A.**    outB: ou
18c60 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20  tput one row of 
18c70 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49  B (UNION and UNI
18c80 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20  ON ALL only).** 
18c90 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20     EofA: ....** 
18ca0 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20     EofB: ....** 
18cb0 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AltB: ....** 
18cc0 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20     AeqB: ....** 
18cd0 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20     AgtB: ....** 
18ce0 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c     Init: initial
18cf0 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65  ize coroutine re
18d00 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20  gisters.**      
18d10 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a      yield coA.**
18d20 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
18d30 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a  (A) goto EofA.**
18d40 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
18d50 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coB.**          
18d60 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45  if eof(B) goto E
18d70 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20  ofB.**    Cmpr: 
18d80 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20  Compare A, B.** 
18d90 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c           Jump Al
18da0 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a  tB, AeqB, AgtB.*
18db0 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a  *     End: ....*
18dc0 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74  *.** We call Alt
18dd0 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45  B, AeqB, AgtB, E
18de0 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73  ofA, and EofB "s
18df0 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20  ubroutines" but 
18e00 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  they are not.** 
18e10 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20  actually called 
18e20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20  using Gosub and 
18e30 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75  they do not Retu
18e40 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f  rn.  EofA and Eo
18e50 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c  fB loop.** until
18e60 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68   all data is exh
18e70 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70  austed then jump
18e80 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61   to the "end" la
18e90 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c  be.  AltB, AeqB,
18ea0 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d  .** and AgtB jum
18eb0 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f  p to either L2 o
18ec0 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41  r to one of EofA
18ed0 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66   or EofB..*/.#if
18ee0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18ef0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
18f00 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
18f10 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a  iSelectOrderBy(.
18f20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18f30 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
18f40 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18f50 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
18f60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
18f70 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
18f80 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
18f90 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
18fa0 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
18fb0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
18fc0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
18fd0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
18fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
18ff0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53   counters */.  S
19000 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
19010 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
19020 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
19030 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
19040 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
19050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
19060 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
19070 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
19080 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20 20  ectDest destA;  
19090 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
190a0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
190b0 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  A */.  SelectDes
190c0 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20  t destB;     /* 
190d0 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
190e0 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20  coroutine B */. 
190f0 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20   int regAddrA;  
19100 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
19110 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
19120 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
19130 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  e */.  int regAd
19140 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drB;         /* 
19150 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
19160 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f   for select-B co
19170 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19180 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
19190 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
191a0 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
191b0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
191c0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
191d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
191e0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
191f0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
19200 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
19210 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
19220 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
19230 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
19240 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
19250 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
19260 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
19270 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
19280 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
19290 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
192a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
192b0 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
192c0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
192d0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
192e0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
192f0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
19300 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
19310 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
19320 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
19330 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
19340 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
19350 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
19360 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42  int addrEofA_noB
19370 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61  ;     /* Alterna
19380 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20 42  te addrEofA if B
19390 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   is uninitialize
193a0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  d */.  int addrE
193b0 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
193c0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
193d0 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
193e0 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
193f0 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
19400 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
19410 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
19420 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
19430 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
19440 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19450 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
19460 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
19470 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
19480 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
19490 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
194a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
194b0 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
194c0 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
194d0 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
194e0 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
194f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
19500 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
19510 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
19520 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
19530 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
19540 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
19550 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
19560 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
19570 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
19580 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
19590 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
195a0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
195b0 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
195c0 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
195d0 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
195e0 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
195f0 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
19600 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
19610 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
19620 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
19630 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
19640 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
19650 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
19660 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  tmt */.  int add
19670 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  r1;            /
19680 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
19690 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
196a0 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
196b0 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
196c0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
196d0 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
196e0 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
196f0 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
19700 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
19710 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
19720 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
19730 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
19740 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
19750 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
19760 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
19770 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
19780 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
19790 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
197a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
197b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
197c0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
197d0 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
197e0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
197f0 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
19800 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19810 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
19820 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
19830 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
19840 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
19850 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
19860 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
19870 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
19880 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
19890 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
198a0 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20  .  int iSub1;   
198b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
198c0 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
198d0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
198e0 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20  Sub2;           
198f0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
19900 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
19910 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
19920 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
19930 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19940 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
19950 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
19960 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
19970 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
19980 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
19990 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
199a0 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
199b0 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
199c0 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
199d0 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
199e0 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
199f0 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
19a00 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19a10 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
19a20 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
19a30 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
19a40 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
19a50 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19a60 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
19a70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
19a80 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
19a90 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
19aa0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
19ab0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
19ac0 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
19ad0 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
19ae0 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
19af0 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
19b00 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
19b10 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
19b20 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
19b30 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
19b40 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
19b50 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
19b60 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
19b70 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
19b80 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
19b90 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19ba0 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
19bb0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
19bc0 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
19bd0 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
19be0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
19bf0 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
19c00 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
19c10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
19c20 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19c30 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
19c40 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
19c50 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
19c60 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
19c70 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
19c80 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19c90 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
19ca0 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
19cb0 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
19cc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19cd0 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
19ce0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
19cf0 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
19d00 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
19d10 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
19d20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
19d30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19d40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
19d50 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
19d60 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
19d70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
19d80 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20  iValue = i;.    
19d90 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
19da0 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
19db0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
19dc0 6e 64 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65  nd(pParse, pOrde
19dd0 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  rBy, pNew);.    
19de0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
19df0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e   ) pOrderBy->a[n
19e00 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69  OrderBy++].u.x.i
19e10 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
19e20 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  6)i;.      }.   
19e30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d   }.  }..  /* Com
19e40 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  pute the compari
19e50 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  son permutation 
19e60 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68 61 74  and keyinfo that
19e70 20 69 73 20 75 73 65 64 20 77 69 74 68 0a 20 20   is used with.  
19e80 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61 74 69  ** the permutati
19e90 6f 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  on used to deter
19ea0 6d 69 6e 65 20 69 66 20 74 68 65 20 6e 65 78 74  mine if the next
19eb0 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73  .  ** row of res
19ec0 75 6c 74 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ults comes from 
19ed0 73 65 6c 65 63 74 41 20 6f 72 20 73 65 6c 65 63  selectA or selec
19ee0 74 42 2e 20 20 41 6c 73 6f 20 61 64 64 20 65 78  tB.  Also add ex
19ef0 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c  plicit.  ** coll
19f00 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52  ations to the OR
19f10 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65  DER BY clause te
19f20 72 6d 73 20 73 6f 20 74 68 61 74 20 77 68 65 6e  rms so that when
19f30 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
19f40 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 69 67 68    ** to the righ
19f50 74 20 61 6e 64 20 74 68 65 20 6c 65 66 74 20 61  t and the left a
19f60 72 65 20 65 76 61 6c 75 61 74 65 64 2c 20 74 68  re evaluated, th
19f70 65 79 20 75 73 65 20 74 68 65 20 63 6f 72 72 65  ey use the corre
19f80 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  ct.  ** collatio
19f90 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75  n..  */.  aPermu
19fa0 74 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  te = sqlite3DbMa
19fb0 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69  llocRawNN(db, si
19fc0 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65  zeof(int)*(nOrde
19fd0 72 42 79 20 2b 20 31 29 29 3b 0a 20 20 69 66 28  rBy + 1));.  if(
19fe0 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
19ff0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1a000 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1a010 20 20 61 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20    aPermute[0] = 
1a020 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 66 6f  nOrderBy;.    fo
1a030 72 28 69 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=1, pItem=pOr
1a040 64 65 72 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72  derBy->a; i<=nOr
1a050 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
1a060 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
1a070 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1a080 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
1a090 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a0a0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1a0b0 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
1a0c0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1a0d0 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
1a0e0 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
1a0f0 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
1a100 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
1a110 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1a120 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65  ByKeyInfo(pParse
1a130 2c 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  , p, 1);.  }else
1a140 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
1a150 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
1a160 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
1a170 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
1a180 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
1a190 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1a1a0 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
1a1b0 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
1a1c0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1a1d0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
1a1e0 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
1a1f0 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
1a200 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
1a210 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
1a220 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
1a230 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
1a240 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
1a250 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
1a260 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
1a270 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
1a280 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
1a290 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
1a2a0 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
1a2b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1a2c0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
1a2d0 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
1a2e0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
1a2f0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
1a300 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1a310 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
1a320 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1a330 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
1a340 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
1a350 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
1a360 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
1a370 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
1a380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a390 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
1a3a0 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
1a3b0 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
1a3c0 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
1a3d0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
1a3e0 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
1a3f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
1a400 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
1a410 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
1a420 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1a430 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
1a440 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
1a450 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
1a460 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
1a470 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
1a480 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
1a490 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
1a4a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a4b0 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
1a4c0 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
1a4d0 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
1a4e0 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
1a4f0 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
1a500 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e   0;.  pPrior->pN
1a510 65 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ext = 0;.  sqlit
1a520 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
1a530 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c  oupBy(pParse, p,
1a540 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
1a550 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50  RDER");.  if( pP
1a560 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  rior->pPrior==0 
1a570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
1a580 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1a590 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  y(pParse, pPrior
1a5a0 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  , pPrior->pOrder
1a5b0 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1a5c0 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1a5d0 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74  the limit regist
1a5e0 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65  ers */.  compute
1a5f0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
1a600 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45  Parse, p, labelE
1a610 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
1a620 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41  imit && op==TK_A
1a630 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d  LL ){.    regLim
1a640 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itA = ++pParse->
1a650 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d  nMem;.    regLim
1a660 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  itB = ++pParse->
1a670 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
1a680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a690 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73  P_Copy, p->iOffs
1a6a0 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b  et ? p->iOffset+
1a6b0 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20  1 : p->iLimit,. 
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6e0 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20   regLimitA);.   
1a6f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a700 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p2(v, OP_Copy, r
1a710 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d  egLimitA, regLim
1a720 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  itB);.  }else{. 
1a730 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72     regLimitA = r
1a740 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20  egLimitB = 0;.  
1a750 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  }.  sqlite3ExprD
1a760 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
1a770 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69  mit);.  p->pLimi
1a780 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
1a790 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1a7a0 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d  ->pOffset);.  p-
1a7b0 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  >pOffset = 0;.. 
1a7c0 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50   regAddrA = ++pP
1a7d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1a7e0 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
1a7f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
1a800 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
1a810 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
1a820 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a830 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1a840 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
1a850 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
1a860 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
1a870 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
1a880 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
1a890 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
1a8a0 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  rB);..  /* Gener
1a8b0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
1a8c0 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
1a8d0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1a8e0 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66   to the.  ** lef
1a8f0 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  t of the compoun
1a900 64 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65  d operator - the
1a910 20 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a   "A" select..  *
1a920 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  /.  addrSelectA 
1a930 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1a940 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1a950 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1a960 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1a970 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1a980 2c 20 72 65 67 41 64 64 72 41 2c 20 30 2c 20 61  , regAddrA, 0, a
1a990 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 56  ddrSelectA);.  V
1a9a0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1a9b0 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
1a9c0 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
1a9d0 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
1a9e0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
1a9f0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
1aa00 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
1aa10 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1aa20 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
1aa30 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
1aa40 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1aa50 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41 29  ine(v, regAddrA)
1aa60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  ;.  sqlite3VdbeJ
1aa70 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
1aa80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1aa90 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
1aaa0 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
1aab0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
1aac0 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
1aad0 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
1aae0 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
1aaf0 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
1ab00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1ab10 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1ab20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab30 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1ab40 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42  outine, regAddrB
1ab50 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42  , 0, addrSelectB
1ab60 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1ab70 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45  ((v, "right SELE
1ab80 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69  CT"));.  savedLi
1ab90 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
1aba0 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d  .  savedOffset =
1abb0 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70   p->iOffset;.  p
1abc0 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69  ->iLimit = regLi
1abd0 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73  mitB;.  p->iOffs
1abe0 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c  et = 0;  .  expl
1abf0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1ac00 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub2, pParse->iNe
1ac10 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1ac20 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1ac30 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b  rse, p, &destB);
1ac40 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73  .  p->iLimit = s
1ac50 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e  avedLimit;.  p->
1ac60 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f  iOffset = savedO
1ac70 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  ffset;.  sqlite3
1ac80 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65  VdbeEndCoroutine
1ac90 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  (v, regAddrB);..
1aca0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1acb0 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1acc0 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72  outputs the curr
1acd0 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 41  ent row of the A
1ace0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20  .  ** select as 
1acf0 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20  the next output 
1ad00 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  row of the compo
1ad10 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  und select..  */
1ad20 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
1ad30 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72  nt((v, "Output r
1ad40 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29 3b  outine for A"));
1ad50 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67 65  .  addrOutA = ge
1ad60 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1ad70 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad90 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73 74  p, &destA, pDest
1ada0 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20 20  , regOutA,.     
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1adc0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1add0 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a  belEnd);.  .  /*
1ade0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1adf0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1ae00 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1ae10 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20 2a  row of the B.  *
1ae20 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1ae30 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1ae40 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1ae50 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  select..  */.  i
1ae60 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
1ae70 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
1ae80 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1ae90 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
1aea0 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22 29   routine for B")
1aeb0 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42 20  );.    addrOutB 
1aec0 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  = generateOutput
1aed0 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73  Subroutine(pPars
1aee0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1aef0 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20 70      p, &destB, p
1af00 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a 20  Dest, regOutB,. 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70  regPrev, pKeyDup
1af30 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d  , labelEnd);.  }
1af40 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  .  sqlite3KeyInf
1af50 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29 3b  oUnref(pKeyDup);
1af60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1af70 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
1af80 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
1af90 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
1afa0 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   A.  ** are exha
1afb0 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
1afc0 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42 20  ata in select B 
1afd0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
1afe0 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50  if( op==TK_EXCEP
1aff0 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
1b000 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64  RSECT ){.    add
1b010 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64 72  rEofA_noB = addr
1b020 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64 3b  EofA = labelEnd;
1b030 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1b040 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1b050 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72 6f  (v, "eof-A subro
1b060 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1b070 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
1b080 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b090 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c  _Gosub, regOutB,
1b0a0 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20   addrOutB);.    
1b0b0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 73  addrEofA_noB = s
1b0c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b0d0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1b0e0 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e 64  gAddrB, labelEnd
1b0f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
1b120 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1b130 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b140 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
1b150 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
1b160 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
1b170 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70  p->nSelectRow, p
1b180 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
1b190 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  w);.  }..  /* Ge
1b1a0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1b1b0 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1b1c0 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1b1d0 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
1b1e0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1b1f0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1b200 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
1b210 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1b220 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1b230 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
1b240 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
1b250 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
1b260 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1b270 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
1b280 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
1b290 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
1b2a0 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1b2b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1b2c0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
1b2d0 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
1b2e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b2f0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1b300 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1b310 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1b320 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b330 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1b340 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62 65   labelEnd); Vdbe
1b350 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1b360 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1b370 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  (v, addrEofB);. 
1b380 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1b390 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1b3a0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
1b3b0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1b3c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
1b3d0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1b3e0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
1b3f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b400 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1b410 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
1b420 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b430 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b440 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ld, regAddrA, ad
1b450 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76  drEofA); VdbeCov
1b460 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1b470 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1b480 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1b490 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1b4a0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1b4b0 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
1b4c0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
1b4d0 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1b4e0 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
1b4f0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
1b500 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1b510 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
1b520 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
1b530 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
1b540 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1b550 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
1b560 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1b570 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
1b580 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b590 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1b5a0 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66  egAddrA, addrEof
1b5b0 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  A); VdbeCoverage
1b5c0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1b5d0 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65  VdbeGoto(v, labe
1b5e0 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
1b5f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b600 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1b610 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
1b620 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1b630 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
1b640 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
1b650 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
1b660 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1b670 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
1b680 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1b690 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
1b6a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b6b0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b6c0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1b6d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1b6e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1b6f0 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1b700 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1b710 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
1b720 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1b730 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
1b740 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
1b750 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
1b760 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
1b770 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1b780 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
1b790 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
1b7a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b7b0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b7c0 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56  addrEofA_noB); V
1b7d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1b7e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b7f0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1b800 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45   regAddrB, addrE
1b810 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  ofB); VdbeCovera
1b820 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70  ge(v);..  /* Imp
1b830 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20  lement the main 
1b840 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
1b850 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b860 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b870 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74  elCmpr);.  sqlit
1b880 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b890 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20  OP_Permutation, 
1b8a0 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29  0, 0, 0, (char*)
1b8b0 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54  aPermute, P4_INT
1b8c0 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65  ARRAY);.  sqlite
1b8d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1b8e0 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41  P_Compare, destA
1b8f0 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53  .iSdst, destB.iS
1b900 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20  dst, nOrderBy,. 
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1b930 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59  KeyMerge, P4_KEY
1b940 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
1b950 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
1b960 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b  OPFLAG_PERMUTE);
1b970 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b980 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
1b990 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41   addrAltB, addrA
1b9a0 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 20  eqB, addrAgtB); 
1b9b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b9c0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
1b9d0 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  he this point in
1b9e0 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e   order to termin
1b9f0 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20  ate the query.. 
1ba00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1ba10 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
1ba20 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f   labelEnd);..  /
1ba30 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
1ba40 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
1ba50 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
1ba60 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
1ba70 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
1ba80 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1ba90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
1baa0 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
1bab0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1bac0 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
1bad0 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
1bae0 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72  pPrior;.  pPrior
1baf0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20  ->pNext = p;..  
1bb00 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72  /*** TBD:  Inser
1bb10 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c  t subroutine cal
1bb20 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73  ls to close curs
1bb30 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74  ors on incomplet
1bb40 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72  e.  **** subquer
1bb50 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c  ies ****/.  expl
1bb60 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
1bb70 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
1bb80 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20  1, iSub2, 0);.  
1bb90 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
1bba0 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66  Err!=0;.}.#endif
1bbb0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
1bbc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bbd0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
1bbe0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
1bbf0 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  W)../* An instan
1bc00 63 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43  ce of the SubstC
1bc10 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65  ontext object de
1bc20 73 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74  scribes an subst
1bc30 69 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20  itution edit.** 
1bc40 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
1bc50 6f 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e  on a parse tree.
1bc60 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72  .**.** All refer
1bc70 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73  ences to columns
1bc80 20 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65   in table iTable
1bc90 20 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61   are to be repla
1bca0 63 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e  ced by correspon
1bcb0 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69  ding.** expressi
1bcc0 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a  ons in pEList..*
1bcd0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1bce0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a   SubstContext {.
1bcf0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bd10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1bd20 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  xt */.  int iTab
1bd30 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
1bd40 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66    /* Replace ref
1bd50 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
1bd60 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1bd70 4e 65 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20  NewTable;       
1bd80 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c       /* New tabl
1bd90 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
1bda0 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20  t isLeftJoin;   
1bdb0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54          /* Add T
1bdc0 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70  K_IF_NULL_ROW op
1bdd0 63 6f 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65  codes on each re
1bde0 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  placement */.  E
1bdf0 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
1be00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c           /* Repl
1be10 61 63 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69  acement expressi
1be20 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f  ons */.} SubstCo
1be30 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61  ntext;../* Forwa
1be40 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
1be50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1be60 75 62 73 74 45 78 70 72 4c 69 73 74 28 53 75 62  ubstExprList(Sub
1be70 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72  stContext*, Expr
1be80 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76  List*);.static v
1be90 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
1bea0 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53  SubstContext*, S
1beb0 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  elect*, int);../
1bec0 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67  *.** Scan throug
1bed0 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  h the expression
1bee0 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65   pExpr.  Replace
1bef0 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
1bf00 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20   to.** a column 
1bf10 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20  in table number 
1bf20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f  iTable with a co
1bf30 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d  py of the iColum
1bf40 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  n-th.** entry in
1bf50 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c   pEList.  (But l
1bf60 65 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20  eave references 
1bf70 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c  to the ROWID col
1bf80 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  umn .** unchange
1bf90 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d.).**.** This r
1bfa0 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f  outine is part o
1bfb0 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67  f the flattening
1bfc0 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73   procedure.  A s
1bfd0 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65  ubquery.** whose
1bfe0 20 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64   result set is d
1bff0 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74  efined by pEList
1c000 20 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72   appears as entr
1c010 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d  y in the.** FROM
1c020 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
1c030 45 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68  ECT such that th
1c040 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73  e VDBE cursor as
1c050 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a  signed to that.*
1c060 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e  * FORM clause en
1c070 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20  try is iTable.  
1c080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
1c090 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
1c0a0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
1c0b0 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69 74  pExpr so that it
1c0c0 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
1c0d0 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74   to the source t
1c0e0 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73  able.** of the s
1c0f0 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20 74  ubquery rather t
1c100 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
1c110 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a   the subquery..*
1c120 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a 73  /.static Expr *s
1c130 75 62 73 74 45 78 70 72 28 0a 20 20 53 75 62 73  ubstExpr(.  Subs
1c140 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74  tContext *pSubst
1c150 2c 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  ,  /* Descriptio
1c160 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1c170 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ution */.  Expr 
1c180 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
1c190 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
1c1a0 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
1c1b0 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69  occurs */.){.  i
1c1c0 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
1c1d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78  turn 0;.  if( Ex
1c1e0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1c1f0 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
1c200 29 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69  ).   && pExpr->i
1c210 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
1c220 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20  pSubst->iTable. 
1c230 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   ){.    pExpr->i
1c240 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c250 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62   pSubst->iNewTab
1c260 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45  le;.  }.  if( pE
1c270 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
1c280 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
1c290 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61  ble==pSubst->iTa
1c2a0 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ble ){.    if( p
1c2b0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  Expr->iColumn<0 
1c2c0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1c2d0 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
1c2e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45    }else{.      E
1c2f0 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20  xpr *pNew;.     
1c300 20 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70   Expr *pCopy = p
1c310 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  Subst->pEList->a
1c320 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
1c330 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78  .pExpr;.      Ex
1c340 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  pr ifNullRow;.  
1c350 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
1c360 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26  st->pEList!=0 &&
1c370 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
1c380 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e  pSubst->pEList->
1c390 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
1c3a0 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
1c3b0 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
1c3c0 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
1c3d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
1c3e0 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70  xprIsVector(pCop
1c3f0 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  y) ){.        sq
1c400 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72  lite3VectorError
1c410 4d 73 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72  Msg(pSubst->pPar
1c420 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20  se, pCopy);.    
1c430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c440 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1c450 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64  Subst->pParse->d
1c460 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
1c470 53 75 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69  Subst->isLeftJoi
1c480 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d  n && pCopy->op!=
1c490 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
1c4a0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69         memset(&i
1c4b0 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a  fNullRow, 0, siz
1c4c0 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b  eof(ifNullRow));
1c4d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c  .          ifNul
1c4e0 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f  lRow.op = TK_IF_
1c4f0 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20  NULL_ROW;.      
1c500 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c      ifNullRow.pL
1c510 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20  eft = pCopy;.   
1c520 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1c530 2e 69 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74  .iTable = pSubst
1c540 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->iNewTable;.   
1c550 20 20 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26         pCopy = &
1c560 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20  ifNullRow;.     
1c570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65     }.        pNe
1c580 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
1c590 75 70 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29  up(db, pCopy, 0)
1c5a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c5b0 65 77 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73  ew && pSubst->is
1c5c0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
1c5d0 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1c5e0 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43  perty(pNew, EP_C
1c5f0 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  anBeNull);.     
1c600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c610 20 70 4e 65 77 20 26 26 20 45 78 70 72 48 61 73   pNew && ExprHas
1c620 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
1c630 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
1c640 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69           pNew->i
1c650 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d  RightJoinTable =
1c660 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
1c670 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  inTable;.       
1c680 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
1c690 74 79 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d  ty(pNew, EP_From
1c6a0 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  Join);.        }
1c6b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c6c0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1c6d0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70  Expr);.        p
1c6e0 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
1c6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1c700 73 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70  se{.    if( pExp
1c710 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c  r->op==TK_IF_NUL
1c720 4c 5f 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e  L_ROW && pExpr->
1c730 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e  iTable==pSubst->
1c740 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
1c750 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1c760 70 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c  pSubst->iNewTabl
1c770 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78  e;.    }.    pEx
1c780 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
1c790 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70 45  tExpr(pSubst, pE
1c7a0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1c7b0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
1c7c0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1c7d0 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1c7e0 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48  );.    if( ExprH
1c7f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1c800 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
1c810 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1c820 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 45 78  lect(pSubst, pEx
1c830 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31  pr->x.pSelect, 1
1c840 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c850 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1c860 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  t(pSubst, pExpr-
1c870 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d  >x.pList);.    }
1c880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
1c890 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  xpr;.}.static vo
1c8a0 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  id substExprList
1c8b0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1c8c0 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1c8d0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1c8e0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1c8f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1c900 74 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t       /* List 
1c910 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
1c920 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1c930 73 74 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20  stitutes */.){. 
1c940 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1c950 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1c960 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1c970 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
1c980 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
1c990 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
1c9a0 78 70 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73  xpr(pSubst, pLis
1c9b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
1c9c0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
1c9d0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
1c9e0 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1c9f0 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69  Subst, /* Descri
1ca00 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1ca10 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53  stitution */.  S
1ca20 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1ca30 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
1ca40 74 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63  tatement in whic
1ca50 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1ca60 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  tutions */.  int
1ca70 20 64 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20   doPrior        
1ca80 20 20 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74     /* Do substit
1ca90 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f  utes on p->pPrio
1caa0 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72  r too */.){.  Sr
1cab0 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
1cac0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1cad0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
1cae0 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
1caf0 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20  eturn;.  do{.   
1cb00 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1cb10 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74  Subst, p->pEList
1cb20 29 3b 0a 20 20 20 20 73 75 62 73 74 45 78 70 72  );.    substExpr
1cb30 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e  List(pSubst, p->
1cb40 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73  pGroupBy);.    s
1cb50 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1cb60 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  bst, p->pOrderBy
1cb70 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e  );.    p->pHavin
1cb80 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  g = substExpr(pS
1cb90 75 62 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67  ubst, p->pHaving
1cba0 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65  );.    p->pWhere
1cbb0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75   = substExpr(pSu
1cbc0 62 73 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  bst, p->pWhere);
1cbd0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  .    pSrc = p->p
1cbe0 53 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Src;.    assert(
1cbf0 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20   pSrc!=0 );.    
1cc00 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1cc10 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b  , pItem=pSrc->a;
1cc20 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
1cc30 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ++){.      subst
1cc40 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70  Select(pSubst, p
1cc50 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31  Item->pSelect, 1
1cc60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1cc70 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1cc80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73   ){.        subs
1cc90 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1cca0 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1ccb0 63 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  cArg);.      }. 
1ccc0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64     }.  }while( d
1ccd0 6f 50 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70  oPrior && (p = p
1cce0 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a  ->pPrior)!=0 );.
1ccf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1cd00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1cd10 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1cd20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1cd30 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66  IT_VIEW) */..#if
1cd40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1cd50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1cd60 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1cd70 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
1cd80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1cd90 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
1cda0 74 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20  tten subqueries 
1cdb0 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  as a performance
1cdc0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a   optimization..*
1cdd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
1cde0 65 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d  eturns 1 if it m
1cdf0 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64  akes changes and
1ce00 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e   0 if no flatten
1ce10 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ing occurs..**.*
1ce20 2a 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  * To understand 
1ce30 74 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66  the concept of f
1ce40 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69  lattening, consi
1ce50 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1ce60 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a  g.** query:.**.*
1ce70 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46  *     SELECT a F
1ce80 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20  ROM (SELECT x+y 
1ce90 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  AS a FROM t1 WHE
1cea0 52 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20  RE z<100) WHERE 
1ceb0 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  a>5.**.** The de
1cec0 66 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70  fault way of imp
1ced0 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71  lementing this q
1cee0 75 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75  uery is to execu
1cef0 74 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65  te the.** subque
1cf00 72 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f  ry first and sto
1cf10 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
1cf20 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1cf30 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e  ble, then.** run
1cf40 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cf50 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1cf60 72 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20  ry table.  This 
1cf70 72 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20  requires two.** 
1cf80 70 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20  passes over the 
1cf90 64 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f  data.  Furthermo
1cfa0 72 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20  re, because the 
1cfb0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a  temporary table.
1cfc0 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65  ** has no indice
1cfd0 73 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  s, the WHERE cla
1cfe0 75 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72  use on the outer
1cff0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
1d000 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a  .** optimized..*
1d010 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d020 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  e attempts to re
1d030 77 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75  write queries su
1d040 63 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20  ch as the above 
1d050 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65  into.** a single
1d060 20 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69   flat select, li
1d070 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1d080 20 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53     SELECT x+y AS
1d090 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1d0a0 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a   z<100 AND a>5.*
1d0b0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65  *.** The code ge
1d0c0 6e 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73  nerated for this
1d0d0 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20   simplification 
1d0e0 67 69 76 65 73 20 74 68 65 20 73 61 6d 65 20 72  gives the same r
1d0f0 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c  esult.** but onl
1d100 79 20 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68  y has to scan th
1d110 65 20 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e  e data once.  An
1d120 64 20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65  d because indice
1d130 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73  s might .** exis
1d140 74 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74  t on the table t
1d150 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63  1, a complete sc
1d160 61 6e 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d  an of the data m
1d170 69 67 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64  ight be.** avoid
1d180 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65  ed..**.** Flatte
1d190 6e 69 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20  ning is subject 
1d1a0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
1d1b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a   constraints:.**
1d1c0 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73  .**   (1)  The s
1d1d0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1d1e0 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
1d1f0 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72 65  ot both be aggre
1d200 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
1d210 32 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2)  If the subqu
1d220 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65 67  ery is an aggreg
1d230 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ate then.**     
1d240 20 20 20 28 32 61 29 20 74 68 65 20 6f 75 74 65     (2a) the oute
1d250 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1d260 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1d270 2a 20 20 20 20 20 20 20 20 28 32 62 29 20 74 68  *        (2b) th
1d280 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 75  e outer query mu
1d290 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71 75  st not use subqu
1d2a0 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  eries.**        
1d2b0 20 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e 20       other than 
1d2c0 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61  the one FROM-cla
1d2d0 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68 61  use subquery tha
1d2e0 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  t is a candidate
1d2f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d300 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20  for flattening. 
1d310 20 28 54 68 69 73 20 69 73 20 64 75 65 20 74 6f   (This is due to
1d320 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30 64   ticket [2f7170d
1d330 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20 20  73bf9abf80].**  
1d340 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
1d350 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a  2015-02-09.).**.
1d360 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74 68 65  **   (3)  If the
1d370 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
1d380 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
1d390 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 68  f a LEFT JOIN th
1d3a0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 61  en.**        (3a
1d3b0 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d  ) the subquery m
1d3c0 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e  ay not be a join
1d3d0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28   and.**        (
1d3e0 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  3b) the FROM cla
1d3f0 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71 75  use of the subqu
1d400 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74  ery may not cont
1d410 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ain a virtual.**
1d420 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62               tab
1d430 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  le and.**       
1d440 20 28 33 63 29 20 74 68 65 20 6f 75 74 65 72 20   (3c) the outer 
1d450 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
1d460 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a 2a   an aggregate..*
1d470 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65 20  *.**   (4)  The 
1d480 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f 74  subquery can not
1d490 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a   be DISTINCT..**
1d4a0 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
1d4b0 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
1d4c0 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
1d4d0 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
1d4e0 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
1d4f0 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
1d500 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
1d510 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
1d520 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
1d530 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
1d540 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
1d550 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
1d560 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
1d570 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
1d580 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ries..**.**   (6
1d590 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  )  If the subque
1d5a0 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c  ry is aggregate,
1d5b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d5c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
1d5d0 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1d5e0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1d5f0 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1d600 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1d610 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1d620 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1d630 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1d640 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1d650 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77   a FROM clause w
1d660 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1d670 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1d680 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1d690 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1d6a0 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1d6b0 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1d6c0 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1d6d0 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68  .**   (8)  If th
1d6e0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1d6f0 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1d700 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1d710 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  ot be a join..**
1d720 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68  .**   (9)  If th
1d730 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1d740 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1d750 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1d760 6f 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e  ot be aggregate.
1d770 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1d780 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1d790 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1d7a0 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1d7b0 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1d7c0 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1d7d0 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1d7e0 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1d7f0 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1d800 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1d810 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a       constraint:
1d820 20 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72   "If the subquer
1d830 79 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74  y is aggregate t
1d840 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
1d850 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d  ery .**        m
1d860 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1d870 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1d880 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1d890 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d8a0 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61   may not both ha
1d8b0 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1d8c0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1d8d0 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1d8e0 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1d8f0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1d900 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1d910 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1d920 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1d930 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1d940 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1d950 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1d960 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1d970 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1d980 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
1d990 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
1d9a0 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1d9b0 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1d9c0 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74  *.**  (15)  If t
1d9d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
1d9e0 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
1d9f0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1da00 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
1da10 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1da20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20   use LIMIT..**  
1da30 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
1da40 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
1da50 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
1da60 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49  ..**.**  (16)  I
1da70 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
1da80 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
1da90 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
1daa0 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
1dab0 20 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59      use ORDER BY
1dac0 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
1dad0 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
1dae0 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
1daf0 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
1db00 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
1db10 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
1db20 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
1db30 31 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71  17)  If the subq
1db40 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1db50 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a  nd select, then.
1db60 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20  **        (17a) 
1db70 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  all compound ope
1db80 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61  rators must be a
1db90 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a   UNION ALL, and.
1dba0 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20  **        (17b) 
1dbb0 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20  no terms within 
1dbc0 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
1dbd0 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67  pound may be agg
1dbe0 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  regate.**       
1dbf0 20 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e         or DISTIN
1dc00 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  T, and.**       
1dc10 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65 72   (17c) every ter
1dc20 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75 62  m within the sub
1dc30 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d  query compound m
1dc40 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d 20  ust have a FROM 
1dc50 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
1dc60 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65 72   (17d) the outer
1dc70 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1dc80 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1dc90 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67 61    (17d1) aggrega
1dca0 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  te, or.**       
1dcb0 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44 49         (17d2) DI
1dcc0 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20 20  STINCT, or.**   
1dcd0 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64 33             (17d3
1dce0 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ) a join..**.** 
1dcf0 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65 6e         The paren
1dd00 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79 20  t and sub-query 
1dd10 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45 52  may contain WHER
1dd20 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a 65  E clauses. Subje
1dd30 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ct to.**        
1dd40 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33 29  rules (11), (13)
1dd50 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79 20   and (14), they 
1dd60 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1dd70 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20   ORDER BY,.**   
1dd80 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f       LIMIT and O
1dd90 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 20  FFSET clauses.  
1dda0 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  The subquery can
1ddb0 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d 70  not use any comp
1ddc0 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f  ound.**        o
1ddd0 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74 68  perator other th
1dde0 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63  an UNION ALL bec
1ddf0 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74 68  ause all the oth
1de00 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  er compound.**  
1de10 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73 20        operators 
1de20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64 20  have an implied 
1de30 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20 69  DISTINCT which i
1de40 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a  s disallowed by.
1de50 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72 69  **        restri
1de60 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a  ction (4)..**.**
1de70 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65 61          Also, ea
1de80 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  ch component of 
1de90 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 75  the sub-query mu
1dea0 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  st return the sa
1deb0 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20  me number.**    
1dec0 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63 6f      of result co
1ded0 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20 61  lumns. This is a
1dee0 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69 72  ctually a requir
1def0 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f  ement for any co
1df00 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1df10 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1df20 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 63  t, but all the c
1df30 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69 73  ode here does is
1df40 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1df50 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 63  no.**        suc
1df60 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d  h (illegal) sub-
1df70 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65 6e  query is flatten
1df80 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
1df90 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a 2a  ill detect the.*
1dfa0 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78 20  *        syntax 
1dfb0 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72 6e  error and return
1dfc0 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73 73   a detailed mess
1dfd0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29  age..**.**  (18)
1dfe0 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
1dff0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1e000 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c   select, then al
1e010 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a  l terms of the.*
1e020 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  *        ORDER B
1e030 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  Y clause of the 
1e040 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20 73  parent must be s
1e050 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  imple references
1e060 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20 63   to .**        c
1e070 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73 75  olumns of the su
1e080 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20  b-query..**.**  
1e090 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75 62  (19)  If the sub
1e0a0 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
1e0b0 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1e0c0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a  query may not.**
1e0d0 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
1e0e0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
1e0f0 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
1e100 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1e110 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1e120 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
1e130 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
1e140 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1e150 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
1e160 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
1e170 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
1e180 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
1e190 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
1e1a0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
1e1b0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
1e1c0 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
1e1d0 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
1e1e0 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
1e1f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1e200 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
1e210 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
1e220 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
1e230 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
1e240 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
1e250 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
1e260 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62 71  21)  If the subq
1e270 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54 20  uery uses LIMIT 
1e280 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71  then the outer q
1e290 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 0a  uery may not be.
1e2a0 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1e2b0 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
1e2c0 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
1e2d0 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
1e2e0 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f   subquery may no
1e2f0 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76 65  t be a recursive
1e300 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33   CTE..**.**  (23
1e310 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  )  If the outer 
1e320 71 75 65 72 79 20 69 73 20 61 20 72 65 63 75 72  query is a recur
1e330 73 69 76 65 20 43 54 45 2c 20 74 68 65 6e 20 74  sive CTE, then t
1e340 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79  he sub-query may
1e350 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
1e360 20 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65    a compound que
1e370 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63  ry. This restric
1e380 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
1e390 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
1e3a0 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e  .**        paren
1e3b0 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t to a compound 
1e3c0 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74  query confuses t
1e3d0 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e  he code that han
1e3e0 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72  dles.**        r
1e3f0 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73  ecursive queries
1e400 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28   in multiSelect(
1e410 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 34 29 20 20  )..**.**  (24)  
1e420 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
1e430 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65   not be an aggre
1e440 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74  gate that uses t
1e450 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28  he built-in min(
1e460 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  ) or .**        
1e470 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
1e480 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68  ns.  (Without th
1e490 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  is restriction, 
1e4a0 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a  a query like:.**
1e4b0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
1e4c0 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d  x FROM (SELECT m
1e4d0 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31  ax(y), x FROM t1
1e4e0 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63  )" would not nec
1e4f0 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20  essarily.**     
1e500 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61     return the va
1e510 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20  lue X for which 
1e520 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a  Y was maximal.).
1e530 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  **.**.** In this
1e540 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
1e550 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
1e560 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1e570 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
1e580 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1e590 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
1e5a0 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
1e5b0 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
1e5c0 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
1e5d0 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
1e5e0 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
1e5f0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
1e600 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
1e610 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
1e620 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
1e630 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
1e640 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1e650 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
1e660 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1e670 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
1e680 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1e690 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
1e6a0 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1e6b0 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
1e6c0 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
1e6d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
1e6e0 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
1e6f0 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
1e700 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
1e710 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
1e720 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
1e730 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1e740 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1e750 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1e760 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
1e770 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
1e780 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
1e790 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
1e7a0 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
1e7b0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
1e7c0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
1e7d0 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
1e7e0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
1e7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e800 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
1e810 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
1e820 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
1e830 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
1e840 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
1e850 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1e860 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1e870 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  tions */.){.  co
1e880 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
1e890 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
1e8a0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1e8b0 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  xt;.  Select *pP
1e8c0 61 72 65 6e 74 3b 20 20 20 20 2f 2a 20 43 75 72  arent;    /* Cur
1e8d0 72 65 6e 74 20 55 4e 49 4f 4e 20 41 4c 4c 20 74  rent UNION ALL t
1e8e0 65 72 6d 20 6f 66 20 74 68 65 20 6f 74 68 65 72  erm of the other
1e8f0 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 65 6c 65   query */.  Sele
1e900 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
1e910 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
1e920 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
1e930 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1e940 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
1e950 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1e960 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
1e970 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
1e980 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
1e990 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
1e9a0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1e9b0 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
1e9c0 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
1e9d0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1e9e0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1e9f0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
1ea00 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
1ea10 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1ea20 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
1ea30 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
1ea40 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1ea50 4e 65 77 50 61 72 65 6e 74 20 3d 20 2d 31 3b 2f  NewParent = -1;/
1ea60 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 74 61  * Replacement ta
1ea70 62 6c 65 20 66 6f 72 20 69 50 61 72 65 6e 74 20  ble for iParent 
1ea80 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a  */.  int isLeftJ
1ea90 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  oin = 0; /* True
1eaa0 20 69 66 20 70 53 75 62 20 69 73 20 74 68 65 20   if pSub is the 
1eab0 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 61 20  right side of a 
1eac0 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 20 20 20 20  LEFT JOIN */    
1ead0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1eae0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1eaf0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
1eb00 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20 20   *pWhere;       
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1eb30 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1eb40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69  List_item *pSubi
1eb50 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75  tem;   /* The su
1eb60 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
1eb70 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1eb80 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  ->db;..  /* Chec
1eb90 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74  k to see if flat
1eba0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1ebb0 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ted.  Return 0 i
1ebc0 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  f not..  */.  as
1ebd0 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
1ebe0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
1ebf0 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4f 70  r==0 );.  if( Op
1ec00 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1ec10 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
1ec20 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
1ec30 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
1ec40 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1ec50 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
1ec60 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
1ec70 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
1ec80 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1ec90 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
1eca0 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
1ecb0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
1ecc0 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
1ecd0 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
1ece0 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
1ecf0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1ed00 29 7b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  ){.    if( isAgg
1ed10 20 29 20 72 65 74 75 72 6e 20 30 3b 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 20 20 20 2f 2a 20 52              /* R
1ed40 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
1ed50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
1ed60 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72  ->nSrc>1 ) retur
1ed70 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed90 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 61 29  Restriction (2a)
1eda0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
1edb0 3e 70 57 68 65 72 65 20 26 26 20 45 78 70 72 48  >pWhere && ExprH
1edc0 61 73 50 72 6f 70 65 72 74 79 28 70 2d 3e 70 57  asProperty(p->pW
1edd0 68 65 72 65 2c 45 50 5f 53 75 62 71 75 65 72 79  here,EP_Subquery
1ede0 29 29 0a 20 20 20 20 20 7c 7c 20 28 73 71 6c 69  )).     || (sqli
1edf0 74 65 33 45 78 70 72 4c 69 73 74 46 6c 61 67 73  te3ExprListFlags
1ee00 28 70 2d 3e 70 45 4c 69 73 74 29 20 26 20 45 50  (p->pEList) & EP
1ee10 5f 53 75 62 71 75 65 72 79 29 21 3d 30 0a 20 20  _Subquery)!=0.  
1ee20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 45 78     || (sqlite3Ex
1ee30 70 72 4c 69 73 74 46 6c 61 67 73 28 70 2d 3e 70  prListFlags(p->p
1ee40 4f 72 64 65 72 42 79 29 20 26 20 45 50 5f 53 75  OrderBy) & EP_Su
1ee50 62 71 75 65 72 79 29 21 3d 30 0a 20 20 20 20 29  bquery)!=0.    )
1ee60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
1ee70 3b 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 20 20 20 2f 2a 20 52 65             /* Re
1eea0 73 74 72 69 63 74 69 6f 6e 20 28 32 62 29 20 20  striction (2b)  
1eeb0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  */.    }.  }..  
1eec0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1eed0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1eee0 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
1eef0 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
1ef00 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
1ef10 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
1ef20 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
1ef30 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
1ef40 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
1ef50 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  ressions, we all
1ef60 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
1ef70 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
1ef80 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
1ef90 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
1efa0 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
1efb0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
1efc0 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
1efd0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
1efe0 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
1eff0 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
1f000 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
1f010 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
1f020 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
1f030 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
1f040 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
1f050 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f070 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
1f080 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
1f090 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
1f0a0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f0c0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
1f0d0 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73  ) */.  if( (p->s
1f0e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d  elFlags & SF_Com
1f0f0 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75  pound)!=0 && pSu
1f100 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
1f110 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 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 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f150 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
1f160 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
1f170 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
1f180 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f1a0 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
1f1b0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1f1c0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1f1d0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
1f1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1f1f0 74 72 69 63 74 69 6f 6e 20 28 34 29 20 20 2a 2f  triction (4)  */
1f200 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1f210 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
1f220 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
1f230 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1f240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1f250 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
1f260 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
1f270 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1f280 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73  istinct)!=0 && s
1f290 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1f2a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f2b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1f2c0 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
1f2d0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
1f2e0 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
1f2f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
1f300 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 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 20                  
1f330 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f340 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
1f350 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
1f360 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
1f370 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f380 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f390 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
1f3a0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f3b0 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
1f3c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1f3d0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1f3e0 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
1f3f0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1f400 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
1f410 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1f420 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
1f430 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1f440 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
1f450 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  */.  }.  testcas
1f460 65 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  e( pSub->selFlag
1f470 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
1f480 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f490 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1f4a0 20 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b   SF_MinMaxAgg );
1f4b0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1f4c0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
1f4d0 72 73 69 76 65 7c 53 46 5f 4d 69 6e 4d 61 78 41  rsive|SF_MinMaxA
1f4e0 67 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  gg) ){.    retur
1f4f0 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74  n 0; /* Restrict
1f500 69 6f 6e 73 20 28 32 32 29 20 61 6e 64 20 28 32  ions (22) and (2
1f510 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  4) */.  }.  if( 
1f520 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f530 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
1f540 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1f550 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
1f560 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33   Restriction (23
1f570 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  ) */.  }..  /*. 
1f580 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
1f590 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f5a0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f5b0 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
1f5c0 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1f5d0 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1f5e0 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e 20 45  n itself (3a). E
1f5f0 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20 74 68  xample of why th
1f600 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  is is not.  ** a
1f610 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1f620 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1f630 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1f640 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1f650 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1f660 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1f670 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1f680 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1f690 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1f6a0 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1f6b0 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1f6c0 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1f6d0 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1f6e0 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   ** If the subqu
1f6f0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1f700 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1f710 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 74 68  FT JOIN, then th
1f720 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71 75 65  e outer.  ** que
1f730 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ry cannot be an 
1f740 61 67 67 72 65 67 61 74 65 2e 20 28 33 63 29 20  aggregate. (3c) 
1f750 20 54 68 69 73 20 69 73 20 61 6e 20 61 72 74 69   This is an arti
1f760 66 61 63 74 20 6f 66 20 74 68 65 20 77 61 79 0a  fact of the way.
1f770 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20    ** aggregates 
1f780 61 72 65 20 70 72 6f 63 65 73 73 65 64 20 2d 20  are processed - 
1f790 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65 63 68  there is no mech
1f7a0 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72 6d 69  anism to determi
1f7b0 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 4c  ne if.  ** the L
1f7c0 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65 20 73  EFT JOIN table s
1f7d0 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e 55 4c  hould be all-NUL
1f7e0 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  L..  **.  ** See
1f7f0 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20 23 33   also tickets #3
1f800 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20 23 33  06, #350, and #3
1f810 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  300..  */.  if( 
1f820 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f  (pSubitem->fg.jo
1f830 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
1f840 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 73 4c  R)!=0 ){.    isL
1f850 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20 20 20  eftJoin = 1;.   
1f860 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
1f870 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20 7c 7c  rc>1 || isAgg ||
1f880 20 49 73 56 69 72 74 75 61 6c 28 70 53 75 62 53   IsVirtual(pSubS
1f890 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29 20 29  rc->a[0].pTab) )
1f8a0 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33 61 29  {.      /*  (3a)
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 33 63               (3c
1f8c0 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a 20 20  )     (3b) */.  
1f8d0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1f8e0 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
1f8f0 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46 4e 55  QLITE_EXTRA_IFNU
1f900 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69 66 28  LLROW.  else if(
1f910 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69 73 41   iFrom>0 && !isA
1f920 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 74  gg ){.    /* Set
1f930 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69 6e 20  ting isLeftJoin 
1f940 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f 50 5f  to -1 causes OP_
1f950 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f 64 65  IfNullRow opcode
1f960 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  s to be generate
1f970 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65  d for.    ** eve
1f980 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ry reference to 
1f990 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  any result colum
1f9a0 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72 79 20  n from subquery 
1f9b0 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65 6e 0a  in a join, even.
1f9c0 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20 74 68      ** though th
1f9d0 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63 65 73  ey are not neces
1f9e0 73 61 72 79 2e 20 20 54 68 69 73 20 77 69 6c 6c  sary.  This will
1f9f0 20 73 74 72 65 73 73 2d 74 65 73 74 20 74 68 65   stress-test the
1fa00 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 0a 20   OP_IfNullRow . 
1fa10 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20 2a 2f     ** opcode. */
1fa20 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20  .    isLeftJoin 
1fa30 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  = -1;.  }.#endif
1fa40 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  ..  /* Restricti
1fa50 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68 65 20  on (17): If the 
1fa60 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1fa70 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
1fa80 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a  then it must.  *
1fa90 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55  * use only the U
1faa0 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f  NION ALL operato
1fab0 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74  r. And none of t
1fac0 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  he simple select
1fad0 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68   queries.  ** th
1fae0 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63  at make up the c
1faf0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
1fb00 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  re allowed to be
1fb10 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69   aggregate or di
1fb20 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72  stinct.  ** quer
1fb30 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ies..  */.  if( 
1fb40 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pSub->pPrior ){.
1fb50 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f      if( pSub->pO
1fb60 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
1fb70 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65  return 0;  /* Re
1fb80 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29 20 2a  striction (20) *
1fb90 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  /.    }.    if( 
1fba0 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c  isAgg || (p->sel
1fbb0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1fbc0 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d  nct)!=0 || pSrc-
1fbd0 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  >nSrc!=1 ){.    
1fbe0 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 28    return 0; /* (
1fbf0 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c 20 6f  17d1), (17d2), o
1fc00 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20 20 20  r (17d3) */.    
1fc10 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62 31 3d  }.    for(pSub1=
1fc20 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70 53 75  pSub; pSub1; pSu
1fc30 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69 6f 72  b1=pSub1->pPrior
1fc40 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
1fc50 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  e( (pSub1->selFl
1fc60 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1fc70 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1fc80 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 29  )==SF_Distinct )
1fc90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1fca0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1fcb0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1fcc0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1fcd0 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  ==SF_Aggregate )
1fce0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1fcf0 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b  pSub->pSrc!=0 );
1fd00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fd10 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
1fd20 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73  pr==pSub1->pELis
1fd30 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1fd40 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65    if( (pSub1->se
1fd50 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1fd60 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1fd70 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20 28 31  te))!=0    /* (1
1fd80 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c  7b) */.       ||
1fd90 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20   (pSub1->pPrior 
1fda0 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b  && pSub1->op!=TK
1fdb0 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20 20 20  _ALL)           
1fdc0 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29 20 2a        /* (17a) *
1fdd0 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  /.       || pSub
1fde0 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 20  1->pSrc->nSrc<1 
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe10 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20 20 20   /* (17c) */.   
1fe20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
1fe30 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1fe40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fe50 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1fe60 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
1fe70 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1fe80 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20 69 66   (18). */.    if
1fe90 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
1fea0 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
1feb0 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69       for(ii=0; i
1fec0 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i<p->pOrderBy->n
1fed0 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
1fee0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64       if( p->pOrd
1fef0 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e  erBy->a[ii].u.x.
1ff00 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29  iOrderByCol==0 )
1ff10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1ff20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1ff30 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61  /***** If we rea
1ff40 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66  ch this point, f
1ff50 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1ff60 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20  mitted. *****/. 
1ff70 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
1ff80 50 61 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65  Parse,p,("flatte
1ff90 6e 20 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72  n %s.%p from ter
1ffa0 6d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m %d\n",.       
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62              pSub
1ffc0 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62  ->zSelName, pSub
1ffd0 2c 20 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a  , iFrom));..  /*
1ffe0 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73   Authorize the s
1fff0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61  ubquery */.  pPa
20000 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
20010 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e  t = pSubitem->zN
20020 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ame;.  TESTONLY(
20030 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68  i =) sqlite3Auth
20040 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20050 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
20060 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73  0, 0);.  testcas
20070 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  e( i==SQLITE_DEN
20080 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  Y );.  pParse->z
20090 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
200a0 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
200b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75  ..  /* If the su
200c0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
200d0 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
200e0 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79  tement, then (by
200f0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20   restrictions.  
20100 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f  ** 17 and 18 abo
20110 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  ve) it must be a
20120 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74   UNION ALL and t
20130 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
20140 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66  must .  ** be of
20150 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a   the form:.  **.
20160 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
20170 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d  <expr-list> FROM
20180 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c   (<sub-query>) <
20190 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20  where-clause> . 
201a0 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65   **.  ** followe
201b0 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42  d by any ORDER B
201c0 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20  Y, LIMIT and/or 
201d0 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
201e0 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20  This block.  ** 
201f0 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69  creates N-1 copi
20200 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  es of the parent
20210 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20 61   query without a
20220 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
20230 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53  IT or .  ** OFFS
20240 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a  ET clauses and j
20250 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65  oins them to the
20260 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20   left-hand-side 
20270 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
20280 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e    ** using UNION
20290 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20   ALL operators. 
202a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20 69  In this case N i
202b0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
202c0 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65  simple.  ** sele
202d0 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ct statements in
202e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75   the compound su
202f0 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20  b-query..  **.  
20300 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a  ** Example:.  **
20310 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
20320 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a   a+1 FROM (.  **
20330 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78          SELECT x
20340 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
20350 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
20360 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
20370 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20  CT y FROM tab.  
20380 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  **        UNION 
20390 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ALL.  **        
203a0 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20  SELECT abs(z*2) 
203b0 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20  FROM tab2.  **  
203c0 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35 20     ) WHERE a!=5 
203d0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
203e0 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64    ** Transformed
203f0 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   into:.  **.  **
20400 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20       SELECT x+1 
20410 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78  FROM tab WHERE x
20420 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55  +1!=5.  **     U
20430 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
20440 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f    SELECT y+1 FRO
20450 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31 21  M tab WHERE y+1!
20460 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f  =5.  **     UNIO
20470 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  N ALL.  **     S
20480 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31  ELECT abs(z*2)+1
20490 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45   FROM tab2 WHERE
204a0 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20   abs(z*2)+1!=5. 
204b0 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59   **     ORDER BY
204c0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20   1.  **.  ** We 
204d0 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63  call this the "c
204e0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
204f0 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20   flattening"..  
20500 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53  */.  for(pSub=pS
20510 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62  ub->pPrior; pSub
20520 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  ; pSub=pSub->pPr
20530 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ior){.    Select
20540 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72   *pNew;.    Expr
20550 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
20560 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
20570 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d    Expr *pLimit =
20580 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
20590 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20  Expr *pOffset = 
205a0 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->pOffset;.    
205b0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
205c0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
205d0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
205e0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
205f0 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20  ;.    p->pPrior 
20600 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d  = 0;.    p->pLim
20610 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  it = 0;.    p->p
20620 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
20630 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65  pNew = sqlite3Se
20640 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30  lectDup(db, p, 0
20650 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
20660 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77  lectSetName(pNew
20670 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65  , pSub->zSelName
20680 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  );.    p->pOffse
20690 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20  t = pOffset;.   
206a0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
206b0 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
206c0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
206d0 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
206e0 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
206f0 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
20700 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
20710 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
20720 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
20730 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
20740 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
20750 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
20760 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
20770 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
20780 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
20790 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
207a0 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
207b0 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
207c0 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63  ,p,.         ("c
207d0 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
207e0 20 66 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74   flattener creat
207f0 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
20800 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e  \n",.         pN
20810 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e  ew->zSelName, pN
20820 65 77 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew));.    }.    
20830 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
20840 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
20850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  .  }..  /* Begin
20860 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
20870 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f  iFrom-th entry o
20880 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
20890 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  e .  ** in the o
208a0 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f  uter query..  */
208b0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 31 20  .  pSub = pSub1 
208c0 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c  = pSubitem->pSel
208d0 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  ect;..  /* Delet
208e0 65 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  e the transient 
208f0 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
20900 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20910 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
20920 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
20930 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
20940 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
20950 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
20960 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a  (db, pSubitem->z
20970 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
20980 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
20990 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
209a0 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62  pSubitem->zDatab
209b0 61 73 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69  ase = 0;.  pSubi
209c0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  tem->zName = 0;.
209d0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69    pSubitem->zAli
209e0 61 73 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  as = 0;.  pSubit
209f0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  em->pSelect = 0;
20a00 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c  ..  /* Defer del
20a10 65 74 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20  eting the Table 
20a20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
20a30 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
20a40 73 75 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63  subquery until c
20a50 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69  ode generation i
20a60 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c  s.  ** complete,
20a70 20 73 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79   since there may
20a80 20 73 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70   still exist Exp
20a90 72 2e 70 54 61 62 20 65 6e 74 72 69 65 73 20 74  r.pTab entries t
20aa0 68 61 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74  hat.  ** refer t
20ab0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65  o the subquery e
20ac0 76 65 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65  ven after flatte
20ad0 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33  ning.  Ticket #3
20ae0 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70  346..  **.  ** p
20af0 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73  Subitem->pTab is
20b00 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c   always non-NULL
20b10 20 62 79 20 74 65 73 74 20 72 65 73 74 72 69 63   by test restric
20b20 74 69 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20  tions and tests 
20b30 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  above..  */.  if
20b40 28 20 41 4c 57 41 59 53 28 70 53 75 62 69 74 65  ( ALWAYS(pSubite
20b50 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  m->pTab!=0) ){. 
20b60 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f     Table *pTabTo
20b70 44 65 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Del = pSubitem->
20b80 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
20b90 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
20ba0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
20bb0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
20bc0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
20bd0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
20be0 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
20bf0 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
20c00 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
20c10 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
20c20 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
20c30 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
20c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
20c50 61 62 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66  abToDel->nTabRef
20c60 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
20c70 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
20c80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
20c90 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
20ca0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
20cb0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
20cc0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
20cd0 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
20ce0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
20cf0 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
20d00 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
20d10 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
20d20 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
20d30 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
20d40 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
20d50 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
20d60 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
20d70 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
20d80 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
20d90 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
20da0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
20db0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
20dc0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
20dd0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
20de0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
20df0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
20e00 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
20e10 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
20e20 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
20e30 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
20e40 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
20e50 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
20e60 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
20e70 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
20e80 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
20e90 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
20ea0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
20eb0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
20ec0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
20ed0 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
20ee0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
20ef0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
20f00 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
20f10 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
20f20 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
20f30 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
20f40 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
20f50 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
20f60 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
20f70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
20f80 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
20f90 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
20fa0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
20fb0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
20fc0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
20fd0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
20fe0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
20ff0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
21000 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
21010 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
21020 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
21030 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
21040 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
21050 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
21060 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
21070 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
21080 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
21090 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
210a0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
210b0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
210c0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
210d0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
210e0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
210f0 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
21100 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  >fg.jointype;.  
21110 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
21120 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d  ssert( pParent!=
21130 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64  p );  /* 2nd and
21140 20 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65   subsequent time
21150 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  s through the lo
21160 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63  op */.      pSrc
21170 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
21180 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
21190 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30  tAppend(db, 0, 0
211a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
211b0 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pSrc==0 ){.     
211c0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
211d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
211e0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
211f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21200 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
21210 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73   uses a single s
21220 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  lot of the FROM 
21230 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
21240 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79  ter.    ** query
21250 2e 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  .  If the subque
21260 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  ry has more than
21270 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20   one element in 
21280 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c  its FROM clause,
21290 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70  .    ** then exp
212a0 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
212b0 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  ery to make spac
212c0 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64  e for it to hold
212d0 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20   all elements.  
212e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71    ** of the subq
212f0 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  uery..    **.   
21300 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20   ** Example:.   
21310 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45   **.    **    SE
21320 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41  LECT * FROM tabA
21330 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , (SELECT * FROM
21340 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61   sub1, sub2), ta
21350 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  bB;.    **.    *
21360 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72  * The outer quer
21370 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e  y has 3 slots in
21380 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65   its FROM clause
21390 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74  .  One slot of t
213a0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
213b0 71 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c  query (the middl
213c0 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20  e slot) is used 
213d0 62 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  by the subquery.
213e0 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a    The next.    *
213f0 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  * block of code 
21400 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20  will expand the 
21410 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
21420 20 63 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f   clause to 4 slo
21430 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d  ts..    ** The m
21440 69 64 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78  iddle slot is ex
21450 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
21460 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
21470 6d 61 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a  make space.    *
21480 2a 20 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c  * for the two el
21490 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
214a0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
214b0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
214c0 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
214d0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
214e0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
214f0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
21500 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
21510 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
21520 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
21530 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
21540 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
21550 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
21560 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
21570 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
21580 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
21590 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
215a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
215b0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
215c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
215d0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
215e0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
215f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
21600 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
21610 69 6e 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ing);.      asse
21620 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  rt( pSrc->a[i+iF
21630 72 6f 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e  rom].fg.isTabFun
21640 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  c==0 );.      pS
21650 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
21660 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
21670 20 20 20 20 20 20 69 4e 65 77 50 61 72 65 6e 74        iNewParent
21680 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d   = pSubSrc->a[i]
21690 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  .iCursor;.      
216a0 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63 2d  memset(&pSubSrc-
216b0 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  >a[i], 0, sizeof
216c0 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29  (pSubSrc->a[i]))
216d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63  ;.    }.    pSrc
216e0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f  ->a[iFrom].fg.jo
216f0 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70  intype = jointyp
21700 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77  e;.  .    /* Now
21710 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75 74   begin substitut
21720 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65 73  ing subquery res
21730 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
21740 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20  ons for .    ** 
21750 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
21760 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65  e iParent in the
21770 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
21780 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61    ** .    ** Exa
21790 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
217a0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35   **   SELECT a+5
217b0 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c  , b*10 FROM (SEL
217c0 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b  ECT x*3 AS a, y+
217d0 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29  10 AS b FROM t1)
217e0 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20   WHERE a>b;.    
217f0 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20 20  **   \          
21800 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
21810 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65  _________ subque
21820 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  ry __________/  
21830 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a          /.    **
21840 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
21850 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72  __________ outer
21860 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f   query _________
21870 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21880 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20  _____/.    **.  
21890 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20    ** We look at 
218a0 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e  every expression
218b0 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
218c0 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c  ery and every pl
218d0 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a  ace we see.    *
218e0 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69 74  * "a" we substit
218f0 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76  ute "x*3" and ev
21900 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
21910 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74 75   "b" we substitu
21920 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a  te "y+10"..    *
21930 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
21940 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21950 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
21960 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f  nt, any non-zero
21970 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61 6c   iOrderByCol val
21980 75 65 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ues indicate tha
21990 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  t the.      ** O
219a0 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65  RDER BY column e
219b0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 69 64 65  xpression is ide
219c0 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 69 4f  ntical to the iO
219d0 72 64 65 72 42 79 43 6f 6c 27 74 68 0a 20 20 20  rderByCol'th.   
219e0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
219f0 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c   returned by SEL
21a00 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
21a10 75 62 2e 20 53 69 6e 63 65 20 74 68 65 73 65 20  ub. Since these 
21a20 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
21a30 64 6f 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  do not necessari
21a40 6c 79 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ly correspond to
21a50 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45   columns in SELE
21a60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 50 61  CT statement pPa
21a70 72 65 6e 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a  rent,.      ** z
21a80 65 72 6f 20 74 68 65 6d 20 62 65 66 6f 72 65 20  ero them before 
21a90 74 72 61 6e 73 66 65 72 69 6e 67 20 74 68 65 20  transfering the 
21aa0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
21ab0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
21ac0 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69  ** Not doing thi
21ad0 73 20 6d 61 79 20 63 61 75 73 65 20 61 6e 20 65  s may cause an e
21ae0 72 72 6f 72 20 69 66 20 61 20 73 75 62 73 65 71  rror if a subseq
21af0 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 74 68 69  uent call to thi
21b00 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  s.      ** funct
21b10 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
21b20 66 6c 61 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75  flatten a compou
21b30 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 6e 74  nd sub-query int
21b40 6f 20 70 50 61 72 65 6e 74 0a 20 20 20 20 20 20  o pParent.      
21b50 2a 2a 20 28 74 68 65 20 6f 6e 6c 79 20 77 61 79  ** (the only way
21b60 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
21b70 20 69 73 20 69 66 20 74 68 65 20 63 6f 6d 70 6f   is if the compo
21b80 75 6e 64 20 73 75 62 2d 71 75 65 72 79 20 69 73  und sub-query is
21b90 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
21ba0 74 6c 79 20 70 61 72 74 20 6f 66 20 70 53 75 62  tly part of pSub
21bb0 2d 3e 70 53 72 63 29 2e 20 53 65 65 20 74 69 63  ->pSrc). See tic
21bc0 6b 65 74 20 5b 64 31 31 61 36 65 39 30 38 66 5d  ket [d11a6e908f]
21bd0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72  .  */.      Expr
21be0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
21bf0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
21c00 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21c10 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
21c20 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
21c30 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21c40 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
21c50 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21c60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21c70 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  nt->pOrderBy==0 
21c80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21c90 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30   pSub->pPrior==0
21ca0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
21cb0 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  t->pOrderBy = pO
21cc0 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
21cd0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
21ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 68 65  ;.    }.    pWhe
21cf0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
21d00 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
21d10 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  here, 0);.    if
21d20 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e 30 20 29  ( isLeftJoin>0 )
21d30 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45  {.      setJoinE
21d40 78 70 72 28 70 57 68 65 72 65 2c 20 69 4e 65 77  xpr(pWhere, iNew
21d50 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  Parent);.    }. 
21d60 20 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49     if( subqueryI
21d70 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73  sAgg ){.      as
21d80 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
21d90 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20  Having==0 );.   
21da0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
21db0 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ing = pParent->p
21dc0 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
21dd0 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70  rent->pWhere = p
21de0 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61  Where;.      pPa
21df0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
21e00 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
21e10 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  b, .          sq
21e20 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
21e30 20 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20   pSub->pHaving, 
21e40 30 29 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  0), pParent->pHa
21e50 76 69 6e 67 0a 20 20 20 20 20 20 29 3b 0a 20 20  ving.      );.  
21e60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
21e70 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ent->pGroupBy==0
21e80 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
21e90 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  t->pGroupBy = sq
21ea0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
21eb0 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
21ec0 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  pBy, 0);.    }el
21ed0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  se{.      pParen
21ee0 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  t->pWhere = sqli
21ef0 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
21f00 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e  Where, pParent->
21f10 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20  pWhere);.    }. 
21f20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
21f30 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20  cFailed==0 ){.  
21f40 20 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74      SubstContext
21f50 20 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72   x;.      x.pPar
21f60 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
21f70 20 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50     x.iTable = iP
21f80 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
21f90 4e 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50  NewTable = iNewP
21fa0 61 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69  arent;.      x.i
21fb0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65  sLeftJoin = isLe
21fc0 66 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e  ftJoin;.      x.
21fd0 70 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70  pEList = pSub->p
21fe0 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62  EList;.      sub
21ff0 73 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61  stSelect(&x, pPa
22000 72 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  rent, 0);.    }.
22010 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c    .    /* The fl
22020 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73  attened query is
22030 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74   distinct if eit
22040 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72  her the inner or
22050 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
22060 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  r query is disti
22070 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nct. .    */.   
22080 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61   pParent->selFla
22090 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46  gs |= pSub->selF
220a0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
220b0 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20  ct;.  .    /*.  
220c0 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20    ** SELECT ... 
220d0 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e  FROM (SELECT ...
220e0 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20   LIMIT a OFFSET 
220f0 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45  b) LIMIT x OFFSE
22100 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  T y;.    **.    
22110 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65  ** One is tempte
22120 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20  d to try to add 
22130 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69  a and b to combi
22140 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20  ne the limits.  
22150 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  But this.    ** 
22160 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
22170 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73   either limit is
22180 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a   negative..    *
22190 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
221a0 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  pLimit ){.      
221b0 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20  pParent->pLimit 
221c0 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a  = pSub->pLimit;.
221d0 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d        pSub->pLim
221e0 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  it = 0;.    }.  
221f0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79  }..  /* Finially
22200 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73  , delete what is
22210 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62   left of the sub
22220 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e  query and return
22230 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20  .  ** success.. 
22240 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c   */.  sqlite3Sel
22250 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
22260 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ub1);..#if SELEC
22270 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
22280 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
22290 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
222a0 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
222b0 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c  CE(0x100,pParse,
222c0 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65  p,("After flatte
222d0 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ning:\n"));.    
222e0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
222f0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
22300 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
22310 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
22320 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
22330 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
22340 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
22350 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
22360 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
22370 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22380 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
22390 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
223a0 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61  T_VIEW)./*.** Ma
223b0 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c  ke copies of rel
223c0 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75  evant WHERE clau
223d0 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  se terms of the 
223e0 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f  outer query into
223f0 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c  .** the WHERE cl
22400 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
22410 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
22420 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
22430 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20  OM (SELECT a AS 
22440 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d  x, c-d AS y FROM
22450 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41   t1) WHERE x=5 A
22460 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
22470 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
22480 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
22490 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
224a0 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79  a AS x, c-d AS y
224b0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
224c0 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a  =5 AND c-d=10).*
224d0 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20  *     WHERE x=5 
224e0 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
224f0 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74  The hope is that
22500 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64   the terms added
22510 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75   to the inner qu
22520 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74  ery will make it
22530 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65   more.** efficie
22540 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74  nt..**.** Do not
22550 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70   attempt this op
22560 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a  timization if:.*
22570 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69  *.**   (1) The i
22580 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 61 6e  nner query is an
22590 20 61 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e   aggregate.  (In
225a0 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 27 64   that case, we'd
225b0 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20   really want.** 
225c0 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68        to copy th
225d0 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c  e outer WHERE-cl
225e0 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20  ause terms onto 
225f0 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
22600 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  e of the.**     
22610 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20    inner query.  
22620 42 75 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c  But they probabl
22630 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65  y won't help the
22640 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74  re so do not bot
22650 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32  her.).**.**   (2
22660 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
22670 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69  y is the recursi
22680 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ve part of a com
22690 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
226a0 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  sion..**.**   (3
226b0 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72  ) The inner quer
226c0 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c  y has a LIMIT cl
226d0 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20  ause (since the 
226e0 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57  changes to the W
226f0 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c  HERE.**       cl
22700 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65  ose would change
22710 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   the meaning of 
22720 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a  the LIMIT)..**.*
22730 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65  *   (4) The inne
22740 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72  r query is the r
22750 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
22760 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54  a LEFT JOIN.  (T
22770 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20  he caller.**    
22780 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73     enforces this
22790 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e   restriction sin
227a0 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ce this routine 
227b0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e  does not have en
227c0 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ough.**       in
227d0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f  formation to kno
227e0 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  w.).**.**   (5) 
227f0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
22800 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
22810 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e  inates in the ON
22820 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
22830 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c  .**       of a L
22840 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20  EFT JOIN..**.** 
22850 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63  Return 0 if no c
22860 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
22870 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  and non-zero if 
22880 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52  one or more WHER
22890 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d  E clause.** term
228a0 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64  s are duplicated
228b0 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65   into the subque
228c0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
228d0 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54  t pushDownWhereT
228e0 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70  erms(.  Parse *p
228f0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
22900 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 28   Parse context (
22910 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  for malloc() and
22920 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67   error reporting
22930 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  ) */.  Select *p
22940 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20  Subq,        /* 
22950 54 68 65 20 73 75 62 71 75 65 72 79 20 77 68 6f  The subquery who
22960 73 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  se WHERE clause 
22970 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74  is to be augment
22980 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
22990 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
229a0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
229b0 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
229c0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43  uery */.  int iC
229d0 75 72 73 6f 72 20 20 20 20 20 20 20 20 20 20 20  ursor           
229e0 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
229f0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
22a00 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
22a10 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67  New;.  int nChng
22a20 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = 0;.  Select *
22a30 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
22a40 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
22a50 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  r compound SELEC
22a60 54 73 20 69 6e 20 70 53 75 62 71 20 2a 2f 0a 20  Ts in pSubq */. 
22a70 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29   if( pWhere==0 )
22a80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
22a90 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70  (pX=pSubq; pX; p
22aa0 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  X=pX->pPrior){. 
22ab0 20 20 20 69 66 28 20 28 70 58 2d 3e 73 65 6c 46     if( (pX->selF
22ac0 6c 61 67 73 20 26 20 28 53 46 5f 41 67 67 72 65  lags & (SF_Aggre
22ad0 67 61 74 65 7c 53 46 5f 52 65 63 75 72 73 69 76  gate|SF_Recursiv
22ae0 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  e))!=0 ){.      
22af0 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73 65  testcase( pX->se
22b00 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
22b10 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 74  egate );.      t
22b20 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73 65 6c  estcase( pX->sel
22b30 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
22b40 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20 74 65  sive );.      te
22b50 73 74 63 61 73 65 28 20 70 58 21 3d 70 53 75 62  stcase( pX!=pSub
22b60 71 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  q );.      retur
22b70 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74  n 0; /* restrict
22b80 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28 32 29  ions (1) and (2)
22b90 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
22ba0 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69  if( pSubq->pLimi
22bb0 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t!=0 ){.    retu
22bc0 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
22bd0 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a  tion (3) */.  }.
22be0 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d    while( pWhere-
22bf0 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
22c00 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68     nChng += push
22c10 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70  DownWhereTerms(p
22c20 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57  Parse, pSubq, pW
22c30 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20 69 43  here->pRight, iC
22c40 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57 68 65  ursor);.    pWhe
22c50 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65  re = pWhere->pLe
22c60 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78  ft;.  }.  if( Ex
22c70 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57  prHasProperty(pW
22c80 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e  here,EP_FromJoin
22c90 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a  ) ) return 0; /*
22ca0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 35 20 2a   restriction 5 *
22cb0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45  /.  if( sqlite3E
22cc0 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61  xprIsTableConsta
22cd0 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72 73  nt(pWhere, iCurs
22ce0 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67  or) ){.    nChng
22cf0 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ++;.    while( p
22d00 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53 75  Subq ){.      Su
22d10 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20  bstContext x;.  
22d20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
22d30 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
22d40 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29  ->db, pWhere, 0)
22d50 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65  ;.      x.pParse
22d60 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20   = pParse;.     
22d70 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72   x.iTable = iCur
22d80 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65  sor;.      x.iNe
22d90 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72  wTable = iCursor
22da0 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74  ;.      x.isLeft
22db0 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Join = 0;.      
22dc0 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71  x.pEList = pSubq
22dd0 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
22de0 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70 72  pNew = substExpr
22df0 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (&x, pNew);.    
22e00 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20    pSubq->pWhere 
22e10 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
22e20 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75  (pParse->db, pSu
22e30 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77  bq->pWhere, pNew
22e40 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d  );.      pSubq =
22e50 20 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a   pSubq->pPrior;.
22e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22e70 72 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64  rn nChng;.}.#end
22e80 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
22e90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
22ea0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
22eb0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
22ec0 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73  W) */../*.** Bas
22ed0 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ed on the conten
22ee0 74 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66  ts of the AggInf
22ef0 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  o structure indi
22f00 63 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72  cated by the fir
22f10 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20  st.** argument, 
22f20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68  this function ch
22f30 65 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c  ecks if the foll
22f40 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
22f50 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71  **.**    * the q
22f60 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75  uery contains ju
22f70 73 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72  st a single aggr
22f80 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a  egate function,.
22f90 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67 72  **    * the aggr
22fa0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
22fb0 73 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f  s either min() o
22fc0 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20  r max(), and.** 
22fd0 20 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e     * the argumen
22fe0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
22ff0 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  te function is a
23000 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a   column value..*
23010 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74  *.** If all of t
23020 68 65 20 61 62 6f 76 65 20 61 72 65 20 74 72 75  he above are tru
23030 65 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52  e, then WHERE_OR
23040 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
23050 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a  RE_ORDERBY_MAX.*
23060 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73  * is returned as
23070 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c   appropriate. Al
23080 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  so, *ppMinMax is
23090 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
230a0 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66   the .** list of
230b0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
230c0 64 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  d to the aggrega
230d0 74 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  te before return
230e0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ing..**.** Or, i
230f0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  f the conditions
23100 20 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d   above are not m
23110 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73  et, *ppMinMax is
23120 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
23130 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
23140 4f 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65  ORMAL is returne
23150 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  d..*/.static u8 
23160 6d 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49  minMaxQuery(AggI
23170 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45  nfo *pAggInfo, E
23180 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d  xprList **ppMinM
23190 61 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20  ax){.  int eRet 
231a0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
231b0 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20  NORMAL;         
231c0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
231d0 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78   */..  *ppMinMax
231e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67   = 0;.  if( pAgg
231f0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29  Info->nFunc==1 )
23200 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
23210 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  r = pAggInfo->aF
23220 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a  unc[0].pExpr; /*
23230 20 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   Aggregate funct
23240 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c  ion */.    ExprL
23250 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45  ist *pEList = pE
23260 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  xpr->x.pList;   
23270 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20     /* Arguments 
23280 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20  to agg function 
23290 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
232a0 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
232b0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20  G_FUNCTION );.  
232c0 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
232d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31  pEList->nExpr==1
232e0 20 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   && pEList->a[0]
232f0 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  .pExpr->op==TK_A
23300 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  GG_COLUMN ){.   
23310 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23320 46 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e  Func = pExpr->u.
23330 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66  zToken;.      if
23340 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
23350 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d  (zFunc, "min")==
23360 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65  0 ){.        eRe
23370 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
23380 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a  Y_MIN;.        *
23390 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73  ppMinMax = pELis
233a0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  t;.      }else i
233b0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
233c0 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d  p(zFunc, "max")=
233d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52  =0 ){.        eR
233e0 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
233f0 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20  BY_MAX;.        
23400 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69  *ppMinMax = pELi
23410 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
23420 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
23430 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c   *ppMinMax==0 ||
23440 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45   (*ppMinMax)->nE
23450 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75  xpr==1 );.  retu
23460 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn eRet;.}../*.*
23470 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61  * The select sta
23480 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
23490 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
234a0 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67  ent is an aggreg
234b0 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ate query..** Th
234c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
234d0 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61  t is the associa
234e0 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e  ted aggregate-in
234f0 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  fo object. This 
23500 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73  .** function tes
23510 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54  ts if the SELECT
23520 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
23530 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
23540 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74  count(*) FROM <t
23550 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  bl>.**.** where 
23560 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62  table is a datab
23570 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61  ase table, not a
23580 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
23590 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72  iew. If the quer
235a0 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20  y.** does match 
235b0 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68  this pattern, th
235c0 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
235d0 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
235e0 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a   representing.**
235f0 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e   <tbl> is return
23600 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
23610 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
23620 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69  .static Table *i
23630 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c  sSimpleCount(Sel
23640 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20  ect *p, AggInfo 
23650 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61  *pAggInfo){.  Ta
23660 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70  ble *pTab;.  Exp
23670 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73  r *pExpr;..  ass
23680 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42  ert( !p->pGroupB
23690 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y );..  if( p->p
236a0 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69  Where || p->pELi
236b0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20  st->nExpr!=1 .  
236c0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   || p->pSrc->nSr
236d0 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d  c!=1 || p->pSrc-
236e0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20  >a[0].pSelect.  
236f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
23700 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d  .  }.  pTab = p-
23710 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62  >pSrc->a[0].pTab
23720 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  ;.  pExpr = p->p
23730 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
23740 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  r;.  assert( pTa
23750 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c  b && !pTab->pSel
23760 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a  ect && pExpr );.
23770 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
23780 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20  (pTab) ) return 
23790 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
237a0 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
237b0 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ION ) return 0;.
237c0 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67    if( NEVER(pAgg
237d0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20  Info->nFunc==0) 
237e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
237f0 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  ( (pAggInfo->aFu
23800 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e  nc[0].pFunc->fun
23810 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
23820 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72  NC_COUNT)==0 ) r
23830 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
23840 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44  Expr->flags&EP_D
23850 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e  istinct ) return
23860 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54   0;..  return pT
23870 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ab;.}../*.** If 
23880 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
23890 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61  item passed as a
238a0 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61  n argument was a
238b0 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e  ugmented with an
238c0 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63  .** INDEXED BY c
238d0 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20  lause, then try 
238e0 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70  to locate the sp
238f0 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49  ecified index. I
23900 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73  f there.** was s
23910 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64  uch a clause and
23920 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
23930 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
23940 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  , return .** SQL
23950 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65  ITE_ERROR and le
23960 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
23970 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73  pParse. Otherwis
23980 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20  e, populate .** 
23990 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e  pFrom->pIndex an
239a0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
239b0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
239c0 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
239d0 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  p(Parse *pParse,
239e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
239f0 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
23a00 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  if( pFrom->pTab 
23a10 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49  && pFrom->fg.isI
23a20 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20  ndexedBy ){.    
23a30 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
23a40 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63  rom->pTab;.    c
23a50 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20  har *zIndexedBy 
23a60 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64  = pFrom->u1.zInd
23a70 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65  exedBy;.    Inde
23a80 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
23a90 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
23aa0 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  ex; .        pId
23ab0 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  x && sqlite3StrI
23ac0 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  Cmp(pIdx->zName,
23ad0 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20   zIndexedBy); . 
23ae0 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
23af0 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
23b00 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
23b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
23b20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
23b30 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
23b40 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30  ", zIndexedBy, 0
23b50 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
23b60 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
23b70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
23b80 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
23b90 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49   }.    pFrom->pI
23ba0 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  BIndex = pIdx;. 
23bb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
23bc0 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44  TE_OK;.}./*.** D
23bd0 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53  etect compound S
23be0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
23bf0 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44   that use an ORD
23c00 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74  ER BY clause wit
23c10 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61  h .** an alterna
23c20 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  tive collating s
23c30 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  equence..**.**  
23c40 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f    SELECT ... FRO
23c50 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
23c60 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f  CT ... FROM t2 O
23c70 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41  RDER BY .. COLLA
23c80 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE ....**.** The
23c90 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e  se are rewritten
23ca0 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a   as a subquery:.
23cb0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
23cc0 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  * FROM (SELECT .
23cd0 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50  .. FROM t1 EXCEP
23ce0 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  T SELECT ... FRO
23cf0 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44  M t2).**     ORD
23d00 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54  ER BY ... COLLAT
23d10 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  E ....**.** This
23d20 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
23d30 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63  is necessary bec
23d40 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65  ause the multiSe
23d50 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f  lectOrderBy() ro
23d60 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74  utine.** above t
23d70 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68  hat generates th
23d80 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
23d90 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74  pound SELECT wit
23da0 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  h an ORDER BY cl
23db0 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d  ause.** uses a m
23dc0 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74  erge algorithm t
23dd0 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65  hat requires the
23de0 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20   same collating 
23df0 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a  sequence on the.
23e00 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ** result column
23e10 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45  s as on the ORDE
23e20 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65  R BY clause.  Se
23e30 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70  e ticket.** http
23e40 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72  ://www.sqlite.or
23e50 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35  g/src/info/67095
23e60 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73  74d2a.**.** This
23e70 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
23e80 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66  is only needed f
23e90 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52  or EXCEPT, INTER
23ea0 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e  SECT, and UNION.
23eb0 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c  .** The UNION AL
23ec0 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73  L operator works
23ed0 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69   fine with multi
23ee0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20  SelectOrderBy() 
23ef0 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65  even when.** the
23f00 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74  re are COLLATE t
23f10 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
23f20 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  R BY..*/.static 
23f30 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  int convertCompo
23f40 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
23f50 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ery(Walker *pWal
23f60 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
23f70 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65  .  int i;.  Sele
23f80 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65  ct *pNew;.  Sele
23f90 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  ct *pX;.  sqlite
23fa0 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20  3 *db;.  struct 
23fb0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
23fc0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65  ;.  SrcList *pNe
23fd0 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70  wSrc;.  Parse *p
23fe0 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64  Parse;.  Token d
23ff0 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  ummy;..  if( p->
24000 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
24010 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
24020 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
24030 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  By==0 ) return W
24040 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66  RC_Continue;.  f
24050 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28  or(pX=p; pX && (
24060 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  pX->op==TK_ALL |
24070 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  | pX->op==TK_SEL
24080 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72  ECT); pX=pX->pPr
24090 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d  ior){}.  if( pX=
240a0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
240b0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20  Continue;.  a = 
240c0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a  p->pOrderBy->a;.
240d0 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65    for(i=p->pOrde
240e0 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e  rBy->nExpr-1; i>
240f0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66  =0; i--){.    if
24100 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c  ( a[i].pExpr->fl
24110 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65  ags & EP_Collate
24120 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
24130 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
24140 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a   WRC_Continue;..
24150 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
24160 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61   this point, tha
24170 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e  t means the tran
24180 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65  sformation is re
24190 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50  quired. */..  pP
241a0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
241b0 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
241c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65  Parse->db;.  pNe
241d0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
241e0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
241f0 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
24200 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
24210 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
24220 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20   memset(&dummy, 
24230 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29  0, sizeof(dummy)
24240 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73  );.  pNewSrc = s
24250 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
24260 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
24270 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c  se,0,0,0,&dummy,
24280 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28  pNew,0,0);.  if(
24290 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65   pNewSrc==0 ) re
242a0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
242b0 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20    *pNew = *p;.  
242c0 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72  p->pSrc = pNewSr
242d0 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  c;.  p->pEList =
242e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
242f0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
24300 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  , sqlite3Expr(db
24310 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30  , TK_ASTERISK, 0
24320 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ));.  p->op = TK
24330 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57  _SELECT;.  p->pW
24340 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77  here = 0;.  pNew
24350 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  ->pGroupBy = 0;.
24360 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
24370 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  = 0;.  pNew->pOr
24380 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e  derBy = 0;.  p->
24390 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d  pPrior = 0;.  p-
243a0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d  >pNext = 0;.  p-
243b0 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d  >pWith = 0;.  p-
243c0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
243d0 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73  _Compound;.  ass
243e0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
243f0 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64  s & SF_Converted
24400 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c  )==0 );.  p->sel
24410 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76  Flags |= SF_Conv
24420 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28  erted;.  assert(
24430 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30   pNew->pPrior!=0
24440 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69   );.  pNew->pPri
24450 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
24460 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74  ;.  pNew->pLimit
24470 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
24480 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74  ffset = 0;.  ret
24490 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
244a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
244b0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46   to see if the F
244c0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
244d0 70 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d  pFrom has table-
244e0 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a  valued function.
244f0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49  ** arguments.  I
24500 66 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65  f it does, leave
24510 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
24520 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
24530 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
24540 72 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20  ro, since pFrom 
24550 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
24560 6f 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c  o be a table-val
24570 75 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ued function..*/
24580 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e  .static int cann
24590 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72  otBeFunction(Par
245a0 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75  se *pParse, stru
245b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
245c0 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70  *pFrom){.  if( p
245d0 46 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  From->fg.isTabFu
245e0 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nc ){.    sqlite
245f0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
24600 2c 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61  , "'%s' is not a
24610 20 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f   function", pFro
24620 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  m->zName);.    r
24630 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
24640 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e  eturn 0;.}..#ifn
24650 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24660 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
24670 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
24680 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
24690 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
246a0 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
246b0 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
246c0 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
246d0 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
246e0 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
246f0 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
24700 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
24710 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
24720 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
24730 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
24740 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
24750 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
24760 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
24770 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
24780 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
24790 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
247a0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
247b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
247c0 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
247d0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
247e0 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
247f0 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
24800 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
24810 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
24820 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
24830 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e     /* Current in
24860 6e 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  nermost WITH cla
24870 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
24880 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
24890 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
248a0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
248b0 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
248c0 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
248d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248e0 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
248f0 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
24900 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
24910 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
24920 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
24930 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
24940 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
24950 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
24960 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
24970 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
24980 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
24990 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
249a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
249b0 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
249c0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
249d0 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
249e0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
249f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
24a00 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
24a10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
24a20 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
24a30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24a40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
24a50 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
24a60 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
24a70 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
24a80 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
24a90 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
24aa0 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
24ab0 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
24ac0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
24ad0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
24ae0 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
24af0 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
24b00 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
24b10 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
24b20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
24b30 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
24b40 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
24b50 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
24b60 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
24b70 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
24b80 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
24b90 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
24ba0 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
24bb0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
24bc0 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
24bd0 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
24be0 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
24bf0 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
24c00 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
24c10 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
24c20 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
24c30 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
24c40 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
24c50 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
24c60 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
24c70 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
24c80 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
24c90 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
24ca0 72 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73  ree==0 || (pPars
24cb0 65 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70  e->pWith==0 && p
24cc0 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72  Parse->pWithToFr
24cd0 65 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  ee==0) );.  if( 
24ce0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73  pWith ){.    ass
24cf0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69  ert( pParse->pWi
24d00 74 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20  th!=pWith );.   
24d10 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
24d20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
24d30 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
24d40 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
24d50 66 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73  f( bFree ) pPars
24d60 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d  e->pWithToFree =
24d70 20 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pWith;.  }.}../
24d80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24d90 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67  on checks if arg
24da0 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65  ument pFrom refe
24db0 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c  rs to a CTE decl
24dc0 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49  ared by .** a WI
24dd0 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65  TH clause on the
24de0 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79   stack currently
24df0 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74   maintained by t
24e00 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a  he parser. And,.
24e10 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20  ** if currently 
24e20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45  processing a CTE
24e30 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20   expression, if 
24e40 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76  it is a recursiv
24e50 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74  e.** reference t
24e60 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54  o the current CT
24e70 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  E..**.** If pFro
24e80 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74  m falls into eit
24e90 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63  her of the two c
24ea0 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c  ategories above,
24eb0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20   pFrom->pTab.** 
24ec0 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
24ed0 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61   are populated a
24ee0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20  ccordingly. The 
24ef0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68  caller should ch
24f00 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70  eck.** (pFrom->p
24f10 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72  Tab!=0) to deter
24f20 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
24f30 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c  not a successful
24f40 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f   match.** was fo
24f50 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  und..**.** Wheth
24f60 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63  er or not a matc
24f70 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49  h is found, SQLI
24f80 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
24f90 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a  d if no error.**
24fa0 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
24fb0 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
24fc0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
24fd0 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  e is stored in t
24fe0 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64  he.** parser and
24ff0 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65   some error code
25000 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
25010 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
25020 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
25030 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b  thExpand(.  Walk
25040 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20  er *pWalker, .  
25050 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
25060 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20  tem *pFrom.){.  
25070 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
25080 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
25090 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
250a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
250b0 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
250d0 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f  * Matched CTE (o
250e0 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74  r NULL if no mat
250f0 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ch) */.  With *p
25100 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  With;           
25110 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48           /* WITH
25120 20 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74   clause that pCt
25130 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  e belongs to */.
25140 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
25150 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20  ->pTab==0 );..  
25160 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74  pCte = searchWit
25170 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c  h(pParse->pWith,
25180 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b   pFrom, &pWith);
25190 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20  .  if( pCte ){. 
251a0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
251b0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
251c0 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  List;.    Select
251d0 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65   *pSel;.    Sele
251e0 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  ct *pLeft;      
251f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66            /* Lef
25200 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74  t-most SELECT st
25210 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
25220 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  nt bMayRecursive
25230 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25240 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64  True if compound
25250 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e   joined by UNION
25260 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69   [ALL] */.    Wi
25270 74 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20  th *pSavedWith; 
25280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
25290 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
252a0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f  pParse->pWith */
252b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65  ..    /* If pCte
252c0 2d 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e  ->zCteErr is non
252d0 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f  -NULL at this po
252e0 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69  int, then this i
252f0 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20  s an illegal.   
25300 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65   ** recursive re
25310 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70  ference to CTE p
25320 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72  Cte. Leave an er
25330 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ror in pParse an
25340 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
25350 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e  early. If pCte->
25360 7a 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c  zCteErr is NULL,
25370 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f   then this is no
25380 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65  t a recursive re
25390 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20  ference..    ** 
253a0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72  In this case, pr
253b0 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  oceed.  */.    i
253c0 66 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  f( pCte->zCteErr
253d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
253e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
253f0 2c 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c  , pCte->zCteErr,
25400 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
25410 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25420 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
25430 20 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65      if( cannotBe
25440 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
25450 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e   pFrom) ) return
25460 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
25470 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
25480 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
25490 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
254a0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
254b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
254c0 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
254d0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
254e0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
254f0 74 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61  t;.    pTab->nTa
25500 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54  bRef = 1;.    pT
25510 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ab->zName = sqli
25520 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
25530 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
25540 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
25550 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52  -1;.    pTab->nR
25560 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20  owLogEst = 200; 
25570 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c  assert( 200==sql
25580 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35  ite3LogEst(10485
25590 37 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  76) );.    pTab-
255a0 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
255b0 45 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e  Ephemeral | TF_N
255c0 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
255d0 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
255e0 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
255f0 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70  tDup(db, pCte->p
25600 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
25610 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
25620 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
25630 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
25640 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
25650 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a  om->pSelect );..
25660 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
25670 74 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73  this is a recurs
25680 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20  ive CTE. */.    
25690 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
256a0 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52  elect;.    bMayR
256b0 65 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65  ecursive = ( pSe
256c0 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  l->op==TK_ALL ||
256d0 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   pSel->op==TK_UN
256e0 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62  ION );.    if( b
256f0 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
25700 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
25710 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
25720 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
25730 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66  t->pSrc;.      f
25740 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
25750 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
25760 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
25770 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
25780 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20   &pSrc->a[i];.  
25790 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
257a0 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20  >zDatabase==0 . 
257b0 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
257c0 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20  ->zName!=0 .    
257d0 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
257e0 65 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d  e3StrICmp(pItem-
257f0 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e  >zName, pCte->zN
25800 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29  ame).          )
25810 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
25820 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
25830 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
25840 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
25850 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
25860 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a  Tab->nTabRef++;.
25870 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
25880 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
25890 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20  ecursive;.      
258a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
258b0 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f  }..    /* Only o
258c0 6e 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ne recursive ref
258d0 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74  erence is permit
258e0 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28  ted. */ .    if(
258f0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32   pTab->nTabRef>2
25900 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25910 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20  3ErrorMsg(.     
25920 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75       pParse, "mu
25930 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
25940 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74  s to recursive t
25950 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d  able: %s", pCte-
25960 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
25970 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25980 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
25990 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
259a0 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c  b->nTabRef==1 ||
259b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28   .            ((
259c0 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53  pSel->selFlags&S
259d0 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20  F_Recursive) && 
259e0 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d 3d 32  pTab->nTabRef==2
259f0 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e   ));..    pCte->
25a00 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72 63 75  zCteErr = "circu
25a10 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25  lar reference: %
25a20 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69  s";.    pSavedWi
25a30 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69  th = pParse->pWi
25a40 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  th;.    pParse->
25a50 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20  pWith = pWith;. 
25a60 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
25a70 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 53 65  sive ){.      Se
25a80 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
25a90 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sel->pPrior;.   
25aa0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
25ab0 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20  r->pWith==0 );. 
25ac0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69       pPrior->pWi
25ad0 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69 74 68  th = pSel->pWith
25ae0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
25af0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
25b00 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  r, pPrior);.    
25b10 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20    pPrior->pWith 
25b20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
25b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
25b40 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
25b50 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
25b60 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
25b70 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20 66 6f  = pWith;..    fo
25b80 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c  r(pLeft=pSel; pL
25b90 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65  eft->pPrior; pLe
25ba0 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  ft=pLeft->pPrior
25bb0 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  );.    pEList = 
25bc0 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  pLeft->pEList;. 
25bd0 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f     if( pCte->pCo
25be0 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ls ){.      if( 
25bf0 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74  pEList && pEList
25c00 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70  ->nExpr!=pCte->p
25c10 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  Cols->nExpr ){. 
25c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
25c30 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25c40 74 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20  table %s has %d 
25c50 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f  values for %d co
25c60 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20  lumns",.        
25c70 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c      pCte->zName,
25c80 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20   pEList->nExpr, 
25c90 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
25ca0 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  pr.        );.  
25cb0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
25cc0 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
25cd0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25ce0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c       }.      pEL
25d00 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c  ist = pCte->pCol
25d10 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71  s;.    }..    sq
25d20 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
25d30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
25d40 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e   pEList, &pTab->
25d50 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
25d60 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  l);.    if( bMay
25d70 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
25d80 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c     if( pSel->sel
25d90 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
25da0 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
25db0 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20  pCte->zCteErr = 
25dc0 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
25dd0 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
25de0 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
25df0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
25e00 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63 75 72  zCteErr = "recur
25e10 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
25e20 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
25e30 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
25e40 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
25e50 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
25e60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
25e70 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a  e->zCteErr = 0;.
25e80 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
25e90 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
25ea0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
25eb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
25ec0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
25ed0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
25ee0 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
25ef0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
25f00 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
25f10 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
25f20 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
25f30 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
25f40 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
25f50 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
25f60 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
25f70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25f80 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
25f90 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
25fa0 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
25fb0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
25fc0 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
25fd0 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
25fe0 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
25ff0 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
26000 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
26010 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
26020 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
26030 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
26040 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
26050 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
26060 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
26070 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50  pParse;.  if( pP
26080 61 72 73 65 2d 3e 70 57 69 74 68 20 26 26 20 70  arse->pWith && p
26090 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
260a0 20 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d     With *pWith =
260b0 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
260c0 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66  )->pWith;.    if
260d0 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20  ( pWith!=0 ){.  
260e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
260f0 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68  se->pWith==pWith
26100 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   );.      pParse
26110 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d  ->pWith = pWith-
26120 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20  >pOuter;.    }. 
26130 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69   }.}.#else.#defi
26140 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68  ne selectPopWith
26150 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
26160 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
26170 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
26180 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
26190 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
261a0 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
261b0 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
261c0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
261d0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
261e0 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
261f0 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
26200 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
26210 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
26220 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
26230 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
26240 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
26250 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
26260 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
26270 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
26280 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
26290 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
262a0 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
262b0 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
262c0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
262d0 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
262e0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
262f0 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
26300 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
26310 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
26320 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
26330 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
26340 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
26350 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
26360 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
26370 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
26380 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
26390 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
263a0 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
263b0 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
263c0 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
263d0 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
263e0 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
263f0 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
26400 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
26410 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
26420 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
26430 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
26440 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
26450 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
26460 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
26470 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
26480 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
26490 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
264a0 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
264b0 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
264c0 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
264d0 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
264e0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
264f0 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
26500 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
26510 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
26520 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
26530 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
26540 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
26550 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
26560 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
26570 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
26580 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
26590 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
265a0 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
265b0 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
265c0 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
265d0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
265e0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
265f0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
26600 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
26610 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
26620 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
26630 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
26640 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
26650 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
26660 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
26670 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
26680 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
26690 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
266a0 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
266b0 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  s;..  p->selFlag
266c0 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64  s |= SF_Expanded
266d0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
266e0 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20 20  ocFailed  ){.   
266f0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26700 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56  t;.  }.  if( NEV
26710 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20 7c  ER(p->pSrc==0) |
26720 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53 46  | (selFlags & SF
26730 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b  _Expanded)!=0 ){
26740 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
26750 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54 61  Prune;.  }.  pTa
26760 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
26770 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
26780 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 2d 3e  EList;.  if( p->
26790 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73 71 6c  pWith ){.    sql
267a0 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
267b0 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30  rse, p->pWith, 0
267c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
267d0 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
267e0 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
267f0 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
26800 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
26810 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26820 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
26830 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
26840 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
26850 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
26860 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
26870 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
26880 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
26890 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
268a0 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
268b0 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
268c0 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
268d0 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
268e0 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
268f0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
26900 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
26910 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
26920 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
26930 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
26940 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
26950 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
26960 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
26970 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
26980 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
26990 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
269a0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66  assert( pFrom->f
269b0 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  g.isRecursive==0
269c0 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21   || pFrom->pTab!
269d0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  =0 );.    if( pF
269e0 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
269f0 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
26a00 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
26a10 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69  m->pTab==0 );.#i
26a20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26a30 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
26a40 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
26a50 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
26a60 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
26a70 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
26a80 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
26a90 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
26aa0 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
26ab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26ac0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
26ad0 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
26ae0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
26af0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
26b00 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
26b10 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
26b20 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
26b30 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
26b40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
26b50 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
26b60 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26b70 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
26b80 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75  er, pSel) ) retu
26b90 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26ba0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
26bb0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
26bc0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
26bd0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
26be0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
26bf0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
26c00 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
26c10 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
26c20 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
26c30 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
26c40 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
26c50 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
26c60 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  (db, pFrom->zAli
26c70 61 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  as);.      }else
26c80 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
26c90 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
26ca0 50 72 69 6e 74 66 28 64 62 2c 20 22 73 75 62 71  Printf(db, "subq
26cb0 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a  uery_%p", (void*
26cc0 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  )pTab);.      }.
26cd0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
26ce0 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
26cf0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
26d00 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ; }.      sqlite
26d10 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
26d20 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
26d30 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d  l->pEList,&pTab-
26d40 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f  >nCol,&pTab->aCo
26d50 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
26d60 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
26d70 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
26d80 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
26d90 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
26da0 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
26db0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
26dc0 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
26dd0 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
26de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
26df0 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
26e00 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
26e10 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
26e20 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
26e30 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
26e40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
26e50 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
26e60 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
26e70 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
26e80 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
26e90 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
26ea0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
26eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
26ec0 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66  ->nTabRef>=0xfff
26ed0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
26ee0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
26ef0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
26f00 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
26f10 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
26f20 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
26f30 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
26f40 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
26f50 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
26f60 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
26f70 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
26f80 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
26f90 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
26fa0 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74  (pTab) && cannot
26fb0 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  BeFunction(pPars
26fc0 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
26fd0 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
26fe0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23  Abort;.      }.#
26ff0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
27000 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
27010 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
27020 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
27030 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49  BLE).      if( I
27040 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
27050 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
27060 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e  ){.        i16 n
27070 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
27080 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
27090 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
270a0 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
270b0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
270c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
270d0 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
270e0 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
270f0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
27100 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
27110 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
27120 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27130 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
27140 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pFrom->pSelect, 
27150 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
27160 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
27170 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
27180 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31   pTab->nCol = -1
27190 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
271a0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
271b0 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
271c0 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ect);.        pT
271d0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ab->nCol = nCol;
271e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
271f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
27200 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
27210 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
27220 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
27230 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
27240 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
27250 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
27260 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
27270 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
27280 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
27290 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
272a0 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
272b0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
272c0 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
272d0 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
272e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
272f0 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
27300 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
27310 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
27320 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
27330 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
27340 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
27350 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
27360 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
27370 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
27380 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
27390 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
273a0 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
273b0 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
273c0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
273d0 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
273e0 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
273f0 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
27400 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
27410 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61  K_ASTERISK opera
27420 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
27430 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
27440 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a  n the column.  *
27450 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c  * list.  The fol
27460 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
27470 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
27480 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  he TK_ASTERISK. 
27490 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
274a0 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20  and expand each 
274b0 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
274c0 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
274d0 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65  n.  ** all table
274e0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
274f0 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
27500 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
27510 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
27520 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
27530 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
27540 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
27550 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
27560 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
27570 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
27580 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
27590 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
275a0 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
275b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
275c0 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
275d0 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
275e0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
275f0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
27600 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
27610 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
27620 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
27630 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
27640 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
27650 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
27660 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
27670 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
27680 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
27690 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
276a0 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
276b0 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
276c0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
276d0 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
276e0 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
276f0 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
27700 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
27710 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
27720 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
27730 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
27740 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
27750 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
27760 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
27770 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
27780 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
27790 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
277a0 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
277b0 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
277c0 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
277d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
277e0 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
27810 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
27820 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
27830 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
27840 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
27850 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d  .      pE = a[k]
27860 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52  .pExpr;.      pR
27870 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68  ight = pE->pRigh
27880 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
27890 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
278a0 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  || pRight!=0 );.
278b0 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
278c0 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  !=TK_ASTERISK.  
278d0 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70 21       && (pE->op!
278e0 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
278f0 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49  t->op!=TK_ASTERI
27900 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  SK).      ){.   
27910 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61 72       /* This par
27920 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73 69  ticular expressi
27930 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
27940 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
27950 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
27960 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
27970 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
27980 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 61  (pParse, pNew, a
27990 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [k].pExpr);.    
279a0 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
279b0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
279c0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
279d0 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e  .zName = a[k].zN
279e0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ame;.          p
279f0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
27a00 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b  pr-1].zSpan = a[
27a10 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20  k].zSpan;.      
27a20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d      a[k].zName =
27a30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 5b   0;.          a[
27a40 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20  k].zSpan = 0;.  
27a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27a60 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
27a70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27a80 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78 70       /* This exp
27a90 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a 22  ression is a "*"
27aa0 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22 20   or a "TABLE.*" 
27ab0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  and needs to be.
27ac0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61 6e          ** expan
27ad0 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ded. */.        
27ae0 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d 20  int tableSeen = 
27af0 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  0;      /* Set t
27b00 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20 6d  o 1 when TABLE m
27b10 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20  atches */.      
27b20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d    char *zTName =
27b30 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65 78   0;       /* tex
27b40 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41 42  t of name of TAB
27b50 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  LE */.        if
27b60 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ( pE->op==TK_DOT
27b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
27b80 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74 21  sert( pE->pLeft!
27b90 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
27ba0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
27bb0 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c 65  Property(pE->pLe
27bc0 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29  ft, EP_IntValue)
27bd0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   );.          zT
27be0 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74  Name = pE->pLeft
27bf0 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
27c00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
27c10 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
27c20 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
27c30 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
27c40 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20   pFrom++){.     
27c50 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
27c60 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
27c70 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
27c80 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e   *pSub = pFrom->
27c90 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
27ca0 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
27cb0 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  e = pFrom->zAlia
27cc0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  s;.          con
27cd0 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
27ce0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
27cf0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
27d00 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
27d10 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
27d20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d        zTabName =
27d30 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
27d40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27d50 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
27d60 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b  ocFailed ) break
27d70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27d80 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62  pSub==0 || (pSub
27d90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27da0 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29  NestedFrom)==0 )
27db0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
27dc0 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ub = 0;.        
27dd0 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26      if( zTName &
27de0 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
27df0 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  (zTName, zTabNam
27e00 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)!=0 ){.       
27e10 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
27e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27e30 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20 3d             iDb =
27e40 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
27e50 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
27e60 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
27e70 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d        zSchemaNam
27e80 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d  e = iDb>=0 ? db-
27e90 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
27ea0 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20  me : "*";.      
27eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27ec0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
27ed0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
27ee0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
27ef0 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Name = pTab->aCo
27f00 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  l[j].zName;.    
27f10 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
27f20 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20  olname;  /* The 
27f30 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  computed column 
27f40 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
27f50 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65      char *zToFre
27f60 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64  e;   /* Malloced
27f70 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65   string that nee
27f80 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ds to be freed *
27f90 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f  /.            To
27fa0 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f  ken sColname;  /
27fb0 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  * Computed colum
27fc0 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65  n name as a toke
27fd0 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20  n */..          
27fe0 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20    assert( zName 
27ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
28000 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75  f( zTName && pSu
28010 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  b.             &
28020 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  & sqlite3MatchSp
28030 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c  anName(pSub->pEL
28040 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c  ist->a[j].zSpan,
28050 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d   0, zTName, 0)==
28060 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b  0.            ){
28070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
28080 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
28090 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
280a0 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
280b0 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
280c0 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20 69  'hidden', omit i
280d0 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61 6e  t from the expan
280e0 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ded.            
280f0 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69  ** result-set li
28100 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53 45  st unless the SE
28110 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46 5f  LECT has the SF_
28120 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20 20  IncludeHidden.  
28130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69 74            ** bit
28140 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20 20   set..          
28150 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
28160 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
28170 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  s & SF_IncludeHi
28180 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20  dden)==0.       
28190 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64 65        && IsHidde
281a0 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61  nColumn(&pTab->a
281b0 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20 20  Col[j]) .       
281c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
281d0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
281e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
281f0 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 53            tableS
28200 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20  een = 1;..      
28210 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26        if( i>0 &&
28220 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   zTName==0 ){.  
28230 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28240 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pFrom->fg.joint
28250 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
28260 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
28270 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64       && tableAnd
28280 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62  ColumnIndex(pTab
28290 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  List, i, zName, 
282a0 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20  0, 0).          
282b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
282c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e         /* In a N
282d0 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69  ATURAL join, omi
282e0 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d  t the join colum
282f0 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  ns from the .   
28300 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
28310 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67  table to the rig
28320 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a  ht of the join *
28330 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
28340 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
28350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28360 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
28370 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
28380 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20  (pFrom->pUsing, 
28390 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
283b0 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61  In a join with a
283c0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f   USING clause, o
283d0 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  mit columns in t
283e0 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
283f0 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75     ** using clau
28400 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  se from the tabl
28410 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20  e on the right. 
28420 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
28430 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
28440 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28450 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28460 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20         pRight = 
28470 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
28480 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20  TK_ID, zName);. 
28490 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e             zColn
284a0 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
284b0 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65           zToFree
284c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
284d0 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
284e0 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
284f0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
28500 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
28510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28520 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
28530 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
28540 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  TabName);.      
28550 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
28560 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
28570 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
28580 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  ft, pRight);.   
28590 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
285a0 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20 20  SchemaName ){.  
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
285c0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
285d0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53 63  r(db, TK_ID, zSc
285e0 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20 20  hemaName);.     
285f0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
28600 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
28610 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
28620 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a 20  pLeft, pExpr);. 
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
28650 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
28660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
28670 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  olname = sqlite3
28680 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
28690 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a  %s", zTabName, z
286a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
286b0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
286c0 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
286d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
286e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
286f0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
28700 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  r = pRight;.    
28710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28720 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
28730 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
28740 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
28750 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
28760 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b 65       sqlite3Toke
28770 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65 2c  nInit(&sColname,
28780 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20   zColname);.    
28790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
287a0 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
287b0 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43  Parse, pNew, &sC
287c0 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  olname, 0);.    
287d0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
287e0 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
287f0 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d   & SF_NestedFrom
28800 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
28810 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
28820 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d  rList_item *pX =
28830 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e   &pNew->a[pNew->
28840 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20  nExpr-1];.      
28850 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
28860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28870 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20      pX->zSpan = 
28880 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
28890 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
288a0 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[j].zSpan);. 
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
288c0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
288d0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
288e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
28900 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65  ->zSpan = sqlite
28910 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
28920 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20  .%s.%s",.       
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28950 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c      zSchemaName,
28960 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e   zTabName, zColn
28970 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
28980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
28990 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
289b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58                pX
289c0 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31  ->bSpanIsTab = 1
289d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
289e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
289f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54  te3DbFree(db, zT
28a00 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  oFree);.        
28a10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28a20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c 65        if( !table
28a30 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Seen ){.        
28a40 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a    if( zTName ){.
28a50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
28a60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28a70 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  se, "no such tab
28a80 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29  le: %s", zTName)
28a90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
28aa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
28ab0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
28ac0 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65  Parse, "no table
28ad0 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20  s specified");. 
28ae0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28af0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28b00 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
28b10 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
28b20 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d   pEList);.    p-
28b30 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  >pEList = pNew;.
28b40 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
28b50 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
28b60 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e  p->pEList && p->
28b70 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62  pEList->nExpr>db
28b80 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
28b90 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
28ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
28bb0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
28bc0 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
28bd0 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
28be0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
28bf0 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  bort;.  }.#endif
28c00 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
28c10 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
28c20 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
28c30 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
28c40 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20  e walker..**.** 
28c50 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
28c60 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e  e is the Walker.
28c70 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
28c80 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  en expression tr
28c90 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65  ees.** are walke
28ca0 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63  d without any ac
28cb0 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65  tions being take
28cc0 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20  n at each node. 
28cd0 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20   Presumably,.** 
28ce0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
28cf0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61  e is used for Wa
28d00 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
28d10 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b  ck then .** Walk
28d20 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
28d30 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20  ck is set to do 
28d40 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c  something useful
28d50 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73   for every .** s
28d60 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70  ubquery in the p
28d70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69  arser tree..*/.i
28d80 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61  nt sqlite3ExprWa
28d90 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e  lkNoop(Walker *N
28da0 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f  otUsed, Expr *No
28db0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
28dc0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
28dd0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
28de0 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
28df0 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
28e00 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66   No-op routine f
28e10 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65  or the parse-tre
28e20 65 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c  e walker for SEL
28e30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
28e40 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
28e50 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
28e60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
28e70 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c  lectWalkNoop(Wal
28e80 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65  ker *NotUsed, Se
28e90 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b  lect *NotUsed2){
28ea0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28eb0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
28ec0 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
28ed0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
28ee0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
28ef0 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73  BUG./*.** Always
28f00 20 61 73 73 65 72 74 2e 20 20 54 68 69 73 20 78   assert.  This x
28f10 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
28f20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
28f30 72 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a  roves that the.*
28f40 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  * xSelectCallbac
28f50 6b 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f  k2 is never invo
28f60 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ked..*/.void sql
28f70 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73  ite3SelectWalkAs
28f80 73 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f  sert2(Walker *No
28f90 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e  tUsed, Select *N
28fa0 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
28fb0 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
28fc0 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
28fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  ;.  assert( 0 );
28fe0 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20  .}.#endif./*.** 
28ff0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78  This routine "ex
29000 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20  pands" a SELECT 
29010 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c  statement and al
29020 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72  l of its subquer
29030 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69  ies..** For addi
29040 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
29050 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65  on on what it me
29060 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20  ans to "expand" 
29070 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  a SELECT.** stat
29080 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63  ement, see the c
29090 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65  omment on the se
290a0 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65  lectExpand worke
290b0 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65  r callback above
290c0 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e  ..**.** Expandin
290d0 67 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  g a SELECT state
290e0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
290f0 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73  t step in proces
29100 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54  sing a.** SELECT
29110 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
29120 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29130 74 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64  t must be expand
29140 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d  ed before.** nam
29150 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
29160 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a  performed..**.**
29170 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   If anything goe
29180 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f  s wrong, an erro
29190 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
291a0 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65  tten into pParse
291b0 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  ..** The calling
291c0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65   function can de
291d0 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  tect the problem
291e0 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70   by looking at p
291f0 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61  Parse->nErr.** a
29200 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62  nd/or pParse->db
29210 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a  ->mallocFailed..
29220 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
29230 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
29240 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nd(Parse *pParse
29250 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
29260 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  t){.  Walker w;.
29270 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
29280 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
29290 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
292a0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
292b0 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43  if( pParse->hasC
292c0 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77  ompound ){.    w
292d0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
292e0 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75   = convertCompou
292f0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
29300 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63  ry;.    w.xSelec
29310 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
29320 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
29330 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
29340 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c  t);.  }.  w.xSel
29350 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
29360 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20  lectExpander;.  
29370 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
29380 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69  k2 = selectPopWi
29390 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  th;.  sqlite3Wal
293a0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
293b0 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  ect);.}...#ifnde
293c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
293d0 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69  BQUERY./*.** Thi
293e0 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53  s is a Walker.xS
293f0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61  electCallback ca
29400 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
29410 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65  qlite3SelectType
29420 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66  Info().** interf
29430 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  ace..**.** For e
29440 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  ach FROM-clause 
29450 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f  subquery, add Co
29460 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43  lumn.zType and C
29470 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69  olumn.zColl.** i
29480 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
29490 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
294a0 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
294b0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
294c0 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71  .** of that subq
294d0 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  uery..**.** The 
294e0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
294f0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
29500 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77  the result set w
29510 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a  as constructed.*
29520 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e  * by selectExpan
29530 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79  der() but the ty
29540 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
29550 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73   information was
29560 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74   omitted.** at t
29570 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73  hat point becaus
29580 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61  e identifiers ha
29590 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72  d not yet been r
295a0 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a  esolved.  This.*
295b0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
295c0 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69  led after identi
295d0 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e  fier resolution.
295e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
295f0 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
29600 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
29610 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
29620 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
29630 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
29640 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
29650 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
29660 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
29670 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
29680 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
29690 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73  Resolved );.  as
296a0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
296b0 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49  gs & SF_HasTypeI
296c0 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  nfo)==0 );.  p->
296d0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
296e0 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
296f0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
29700 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
29710 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
29720 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
29730 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
29740 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
29750 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
29760 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
29770 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
29780 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
29790 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
297a0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
297b0 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
297c0 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
297d0 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
297e0 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
297f0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65  LECT */.      Se
29800 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
29810 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
29820 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
29830 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
29840 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
29850 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
29860 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29870 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
29880 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
29890 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
298a0 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
298b0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
298c0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
298d0 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
298e0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
298f0 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
29900 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
29910 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
29920 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
29930 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
29940 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
29950 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
29960 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
29970 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
29980 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
29990 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
299a0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
299b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
299c0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
299d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
299e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
299f0 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
29a00 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
29a10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
29a20 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
29a30 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
29a40 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
29a50 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
29a60 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
29a70 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
29a80 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
29a90 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
29aa0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
29ab0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
29ac0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
29ad0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
29ae0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29af0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
29b00 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
29b10 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
29b20 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
29b30 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
29b40 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
29b50 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
29b60 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
29b70 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
29b80 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
29b90 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
29ba0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
29bb0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
29bc0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
29bd0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
29be0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
29bf0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
29c00 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
29c10 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
29c20 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
29c30 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
29c40 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
29c50 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
29c60 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
29c70 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
29c80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
29c90 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
29ca0 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
29cb0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
29cc0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
29cd0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
29ce0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
29cf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
29d00 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
29d10 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
29d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
29d30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29d40 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
29d50 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
29d60 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
29d70 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
29d80 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
29d90 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
29da0 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
29db0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
29dc0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
29dd0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29de0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
29df0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
29e00 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
29e10 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
29e20 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
29e30 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
29e40 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
29e50 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
29e60 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
29e70 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
29e80 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
29e90 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
29ea0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
29eb0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
29ec0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
29ed0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
29ee0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
29ef0 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
29f00 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
29f10 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
29f20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
29f30 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
29f40 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
29f50 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
29f60 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
29f70 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
29f80 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
29f90 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
29fa0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
29fb0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
29fc0 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
29fd0 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
29fe0 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
29ff0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
2a000 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
2a010 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
2a020 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
2a030 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
2a040 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
2a050 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
2a060 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
2a070 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d  nc;.  int nReg =
2a080 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
2a090 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   + pAggInfo->nCo
2a0a0 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  lumn;.  if( nReg
2a0b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
2a0c0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a0d0 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
2a0e0 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72  at all AggInfo r
2a0f0 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74  egisters are wit
2a100 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70  hin the range sp
2a110 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20  ecified by.  ** 
2a120 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41  AggInfo.mnReg..A
2a130 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a  ggInfo.mxReg */.
2a140 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d    assert( nReg==
2a150 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d  pAggInfo->mxReg-
2a160 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b  pAggInfo->mnReg+
2a170 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 );.  for(i=0; 
2a180 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
2a190 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  umn; i++){.    a
2a1a0 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
2a1b0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  >aCol[i].iMem>=p
2a1c0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
2a1d0 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
2a1e0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
2a1f0 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
2a200 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  eg );.  }.  for(
2a210 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
2a220 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  >nFunc; i++){.  
2a230 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
2a240 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
2a250 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
2a260 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
2a270 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
2a280 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
2a290 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23  ->mxReg );.  }.#
2a2a0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
2a2b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2a2c0 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
2a2d0 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e  o->mnReg, pAggIn
2a2e0 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f  fo->mxReg);.  fo
2a2f0 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
2a300 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
2a310 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2a320 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
2a330 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
2a340 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
2a350 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
2a360 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
2a370 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2a380 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
2a390 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
2a3a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
2a3b0 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
2a3c0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
2a3d0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
2a3e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2a3f0 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
2a400 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
2a410 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
2a420 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
2a430 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
2a440 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
2a450 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
2a460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a470 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2a480 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
2a490 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2a4a0 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20  pE->x.pList, 0, 
2a4b0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
2a4c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2a4d0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2a4e0 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
2a4f0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
2a520 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2a530 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2a540 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
2a550 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
2a560 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
2a570 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
2a580 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
2a590 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
2a5a0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
2a5b0 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
2a5c0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
2a5d0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
2a5e0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2a5f0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2a600 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2a610 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
2a620 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
2a630 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
2a640 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
2a650 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2a660 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
2a670 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2a680 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
2a690 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
2a6a0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2a6b0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
2a6c0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2a6d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a6e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp2(v, OP_AggF
2a6f0 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
2a700 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
2a710 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73  Expr : 0);.    s
2a720 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
2a730 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c  P4(v, pF->pFunc,
2a740 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
2a750 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74  }.}../*.** Updat
2a760 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  e the accumulato
2a770 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66  r memory cells f
2a780 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  or an aggregate 
2a790 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20  based on.** the 
2a7a0 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
2a7b0 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
2a7c0 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63  ic void updateAc
2a7d0 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
2a7e0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2a7f0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2a800 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2a810 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2a820 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20  .  int regHit = 
2a830 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74  0;.  int addrHit
2a840 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  Test = 0;.  stru
2a850 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20  ct AggInfo_func 
2a860 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67  *pF;.  struct Ag
2a870 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a  gInfo_col *pC;..
2a880 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65    pAggInfo->dire
2a890 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f  ctMode = 1;.  fo
2a8a0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2a8b0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2a8c0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2a8d0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
2a8e0 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
2a8f0 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
2a900 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
2a910 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
2a920 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
2a930 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
2a940 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a950 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
2a960 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2a970 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
2a980 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
2a990 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
2a9a0 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
2a9b0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
2a9c0 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
2a9d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2a9e0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
2a9f0 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
2aa00 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43  gg, 0, SQLITE_EC
2aa10 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c  EL_DUP);.    }el
2aa20 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  se{.      nArg =
2aa30 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67   0;.      regAgg
2aa40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
2aa50 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  if( pF->iDistinc
2aa60 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64  t>=0 ){.      ad
2aa70 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  drNext = sqlite3
2aa80 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
2aa90 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
2aaa0 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a  ( nArg==0 );  /*
2aab0 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   Error condition
2aac0 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
2aad0 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20  se( nArg>1 );   
2aae0 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72  /* Also an error
2aaf0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69   */.      codeDi
2ab00 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
2ab10 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
2ab20 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
2ab30 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
2ab40 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  ( pF->pFunc->fun
2ab50 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
2ab60 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
2ab70 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
2ab80 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
2ab90 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2aba0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2abb0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
2abc0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
2abd0 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
2abe0 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
2abf0 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
2ac00 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
2ac10 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
2ac20 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
2ac30 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
2ac40 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
2ac50 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
2ac60 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
2ac70 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
2ac80 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
2ac90 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
2aca0 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
2acb0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
2acc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
2acd0 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49  gHit==0 && pAggI
2ace0 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
2acf0 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70  r ) regHit = ++p
2ad00 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2ad10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2ad20 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
2ad30 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30  eq, regHit, 0, 0
2ad40 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
2ad50 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
2ad60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
2ad70 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2ad80 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67  AggStep0, 0, reg
2ad90 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a  Agg, pF->iMem);.
2ada0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2adb0 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70  ppendP4(v, pF->p
2adc0 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
2add0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2ade0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
2adf0 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  8)nArg);.    sql
2ae00 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
2ae10 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
2ae20 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
2ae30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
2ae40 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
2ae50 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
2ae60 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
2ae70 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
2ae80 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2ae90 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
2aea0 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ext);.      sqli
2aeb0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2aec0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
2aed0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
2aee0 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65  e populating the
2aef0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
2af00 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68  isters, clear th
2af10 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
2af20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
2af30 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65  if any of the re
2af40 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61  quired column va
2af50 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79  lues are already
2af60 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69   present .  ** i
2af70 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c  n registers, sql
2af80 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d  ite3ExprCode() m
2af90 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20  ay use OP_SCopy 
2afa0 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75  to copy the valu
2afb0 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d  e.  ** to pC->iM
2afc0 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74  em. But by the t
2afd0 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73  ime the value is
2afe0 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69   used, the origi
2aff0 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a  nal register.  *
2b000 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  * may have been 
2b010 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69  used, invalidati
2b020 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ng the underlyin
2b030 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67  g buffer holding
2b040 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f   the.  ** text o
2b050 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65  r blob value. Se
2b060 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34  e ticket [883034
2b070 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dcb5]..  **.  **
2b080 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f   Another solutio
2b090 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68  n would be to ch
2b0a0 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70  ange the OP_SCop
2b0b0 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63  y used to copy c
2b0c0 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65  ached.  ** value
2b0d0 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e  s to an OP_Copy.
2b0e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48  .  */.  if( regH
2b0f0 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69  it ){.    addrHi
2b100 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  tTest = sqlite3V
2b110 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2b120 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62  If, regHit); Vdb
2b130 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
2b140 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  }.  sqlite3ExprC
2b150 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2b160 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  );.  for(i=0, pC
2b170 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b  =pAggInfo->aCol;
2b180 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63   i<pAggInfo->nAc
2b190 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20  cumulator; i++, 
2b1a0 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  pC++){.    sqlit
2b1b0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2b1c0 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43  e, pC->pExpr, pC
2b1d0 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70  ->iMem);.  }.  p
2b1e0 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d  AggInfo->directM
2b1f0 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ode = 0;.  sqlit
2b200 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2b210 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2b220 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20  addrHitTest ){. 
2b230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2b240 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69  mpHere(v, addrHi
2b250 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tTest);.  }.}../
2b260 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c  *.** Add a singl
2b270 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  e OP_Explain ins
2b280 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
2b290 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20  VDBE to explain 
2b2a0 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e  a simple.** coun
2b2b0 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c  t(*) query ("SEL
2b2c0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2b2d0 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66  M pTab")..*/.#if
2b2e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b2f0 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20  _EXPLAIN.static 
2b300 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70  void explainSimp
2b310 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65  leCount(.  Parse
2b320 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2b330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2b340 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
2b350 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20   /* Table being 
2b380 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64  queried */.  Ind
2b390 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
2b3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b3b0 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70  Index used to op
2b3c0 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20  timize scan, or 
2b3d0 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  NULL */.){.  if(
2b3e0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
2b3f0 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  ==2 ){.    int b
2b400 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30  Cover = (pIdx!=0
2b410 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
2b420 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72  ab) || !IsPrimar
2b430 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29  yKeyIndex(pIdx))
2b440 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71  );.    char *zEq
2b450 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  p = sqlite3MPrin
2b460 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
2b470 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25  SCAN TABLE %s%s%
2b480 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
2b490 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
2b4a0 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e   bCover ? " USIN
2b4b0 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
2b4c0 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20   " : "",.       
2b4d0 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e   bCover ? pIdx->
2b4e0 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29  zName : "".    )
2b4f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2b500 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
2b510 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20   pParse->pVdbe, 
2b520 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
2b530 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
2b540 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59  , 0, zEqp, P4_DY
2b550 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d  NAMIC.    );.  }
2b560 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
2b570 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
2b580 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
2b590 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78  if../*.** Contex
2b5a0 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 68 61 76  t object for hav
2b5b0 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62  ingToWhereExprCb
2b5c0 28 29 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 48 61  ()..*/.struct Ha
2b5d0 76 69 6e 67 54 6f 57 68 65 72 65 43 74 78 20 7b  vingToWhereCtx {
2b5e0 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2b5f0 65 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  e;.  ExprList *p
2b600 47 72 6f 75 70 42 79 3b 0a 7d 3b 0a 0a 2f 2a 0a  GroupBy;.};../*.
2b610 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ** sqlite3WalkEx
2b620 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73  pr() callback us
2b630 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68  ed by havingToWh
2b640 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ere()..**.** If 
2b650 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20  the node passed 
2b660 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
2b670 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65  is a TK_AND node
2b680 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43  , return .** WRC
2b690 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c  _Continue to tel
2b6a0 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  l sqlite3WalkExp
2b6b0 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20 74  r() to iterate t
2b6c0 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64  hrough child nod
2b6d0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
2b6e0 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f  ise, return WRC_
2b6f0 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63  Prune. In this c
2b700 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20  ase, also check 
2b710 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65  if the .** sub-e
2b720 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65  xpression matche
2b730 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20 66  s the criteria f
2b740 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  or being moved t
2b750 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63  o the WHERE.** c
2b760 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64  lause. If so, ad
2b770 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45 52  d it to the WHER
2b780 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70  E clause and rep
2b790 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78 70  lace the sub-exp
2b7a0 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69  ression.** withi
2b7b0 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70  n the HAVING exp
2b7c0 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63  ression with a c
2b7d0 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a  onstant "1"..*/.
2b7e0 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e  static int havin
2b7f0 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 57  gToWhereExprCb(W
2b800 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2b810 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2b820 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
2b830 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 73 74 72  K_AND ){.    str
2b840 75 63 74 20 48 61 76 69 6e 67 54 6f 57 68 65 72  uct HavingToWher
2b850 65 43 74 78 20 2a 70 20 3d 20 70 57 61 6c 6b 65  eCtx *p = pWalke
2b860 72 2d 3e 75 2e 70 48 61 76 69 6e 67 43 74 78 3b  r->u.pHavingCtx;
2b870 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2b880 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72  ExprIsConstantOr
2b890 47 72 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d  GroupBy(pWalker-
2b8a0 3e 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  >pParse, pExpr, 
2b8b0 70 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a  p->pGroupBy) ){.
2b8c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2b8d0 62 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  b = pWalker->pPa
2b8e0 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45  rse->db;.      E
2b8f0 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
2b900 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
2b910 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71   TK_INTEGER, &sq
2b920 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31  lite3IntTokens[1
2b930 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
2b940 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
2b950 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20   Expr *pWhere = 
2b960 2a 28 70 2d 3e 70 70 57 68 65 72 65 29 3b 0a 20  *(p->ppWhere);. 
2b970 20 20 20 20 20 20 20 53 57 41 50 28 45 78 70 72         SWAP(Expr
2b980 2c 20 2a 70 4e 65 77 2c 20 2a 70 45 78 70 72 29  , *pNew, *pExpr)
2b990 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  ;.        pNew =
2b9a0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
2b9b0 64 62 2c 20 70 57 68 65 72 65 2c 20 70 4e 65 77  db, pWhere, pNew
2b9c0 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 70 2d 3e  );.        *(p->
2b9d0 70 70 57 68 65 72 65 29 20 3d 20 70 4e 65 77 3b  ppWhere) = pNew;
2b9e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b9f0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
2ba00 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  une;.  }.  retur
2ba10 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
2ba20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
2ba30 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d 73  r eligible terms
2ba40 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e 47   from the HAVING
2ba50 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65   clause of a que
2ba60 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ry, which is.** 
2ba70 70 72 6f 63 65 73 73 65 64 20 61 66 74 65 72 20  processed after 
2ba80 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68 65  grouping, to the
2ba90 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 77   WHERE clause, w
2baa0 68 69 63 68 20 69 73 20 70 72 6f 63 65 73 73 65  hich is processe
2bab0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75  d before.** grou
2bac0 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c  ping. For exampl
2bad0 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a  e, the query:.**
2bae0 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46  .**   SELECT * F
2baf0 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45  ROM <tables> WHE
2bb00 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59 20  RE a=? GROUP BY 
2bb10 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44  b HAVING b=? AND
2bb20 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62   c=?.**.** can b
2bb30 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a 0a  e rewritten as:.
2bb40 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
2bb50 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57   FROM <tables> W
2bb60 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f  HERE a=? AND b=?
2bb70 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49   GROUP BY b HAVI
2bb80 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74  NG c=?.**.** A t
2bb90 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e  erm of the HAVIN
2bba0 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  G expression is 
2bbb0 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72 61  eligible for tra
2bbc0 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e 73  nsfer if it cons
2bbd0 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79  ists.** entirely
2bbe0 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e   of constants an
2bbf0 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  d expressions th
2bc00 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f 55  at are also GROU
2bc10 50 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 0a  P BY terms that.
2bc20 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e 41  ** use the "BINA
2bc30 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  RY" collation se
2bc40 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
2bc50 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f 57  c void havingToW
2bc60 68 65 72 65 28 0a 20 20 50 61 72 73 65 20 2a 70  here(.  Parse *p
2bc70 50 61 72 73 65 2c 0a 20 20 45 78 70 72 4c 69 73  Parse,.  ExprLis
2bc80 74 20 2a 70 47 72 6f 75 70 42 79 2c 0a 20 20 45  t *pGroupBy,.  E
2bc90 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 0a 20  xpr *pHaving, . 
2bca0 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 0a   Expr **ppWhere.
2bcb0 29 7b 0a 20 20 73 74 72 75 63 74 20 48 61 76 69  ){.  struct Havi
2bcc0 6e 67 54 6f 57 68 65 72 65 43 74 78 20 73 43 74  ngToWhereCtx sCt
2bcd0 78 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c  x;.  Walker sWal
2bce0 6b 65 72 3b 0a 0a 20 20 73 43 74 78 2e 70 70 57  ker;..  sCtx.ppW
2bcf0 68 65 72 65 20 3d 20 70 70 57 68 65 72 65 3b 0a  here = ppWhere;.
2bd00 20 20 73 43 74 78 2e 70 47 72 6f 75 70 42 79 20    sCtx.pGroupBy 
2bd10 3d 20 70 47 72 6f 75 70 42 79 3b 0a 0a 20 20 6d  = pGroupBy;..  m
2bd20 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20  emset(&sWalker, 
2bd30 30 2c 20 73 69 7a 65 6f 66 28 73 57 61 6c 6b 65  0, sizeof(sWalke
2bd40 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70  r));.  sWalker.p
2bd50 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
2bd60 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
2bd70 61 6c 6c 62 61 63 6b 20 3d 20 68 61 76 69 6e 67  allback = having
2bd80 54 6f 57 68 65 72 65 45 78 70 72 43 62 3b 0a 20  ToWhereExprCb;. 
2bd90 20 73 57 61 6c 6b 65 72 2e 75 2e 70 48 61 76 69   sWalker.u.pHavi
2bda0 6e 67 43 74 78 20 3d 20 26 73 43 74 78 3b 0a 20  ngCtx = &sCtx;. 
2bdb0 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
2bdc0 28 26 73 57 61 6c 6b 65 72 2c 20 70 48 61 76 69  (&sWalker, pHavi
2bdd0 6e 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ng);.}../*.** Ch
2bde0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2bdf0 65 20 70 54 68 69 73 20 65 6e 74 72 79 20 6f 66  e pThis entry of
2be00 20 70 54 61 62 4c 69 73 74 20 69 73 20 61 20 73   pTabList is a s
2be10 65 6c 66 2d 6a 6f 69 6e 20 6f 66 20 61 20 70 72  elf-join of a pr
2be20 69 6f 72 20 76 69 65 77 2e 0a 2a 2a 20 49 66 20  ior view..** If 
2be30 69 74 20 69 73 2c 20 74 68 65 6e 20 72 65 74 75  it is, then retu
2be40 72 6e 20 74 68 65 20 53 72 63 4c 69 73 74 5f 69  rn the SrcList_i
2be50 74 65 6d 20 66 6f 72 20 74 68 65 20 70 72 69 6f  tem for the prio
2be60 72 20 76 69 65 77 2e 20 20 49 66 20 69 74 20 69  r view.  If it i
2be70 73 20 6e 6f 74 2c 0a 2a 2a 20 74 68 65 6e 20 72  s not,.** then r
2be80 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74  eturn 0..*/.stat
2be90 69 63 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  ic struct SrcLis
2bea0 74 5f 69 74 65 6d 20 2a 69 73 53 65 6c 66 4a 6f  t_item *isSelfJo
2beb0 69 6e 56 69 65 77 28 0a 20 20 53 72 63 4c 69 73  inView(.  SrcLis
2bec0 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
2bed0 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2bee0 20 66 6f 72 20 73 65 6c 66 2d 6a 6f 69 6e 73 20   for self-joins 
2bef0 69 6e 20 74 68 69 73 20 46 52 4f 4d 20 63 6c 61  in this FROM cla
2bf00 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
2bf10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
2bf20 68 69 73 20 20 20 2f 2a 20 53 65 61 72 63 68 20  his   /* Search 
2bf30 66 6f 72 20 70 72 69 6f 72 20 72 65 66 65 72 65  for prior refere
2bf40 6e 63 65 20 74 6f 20 74 68 69 73 20 73 75 62 71  nce to this subq
2bf50 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  uery */.){.  str
2bf60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2bf70 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 70   *pItem;.  for(p
2bf80 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d  Item = pTabList-
2bf90 3e 61 3b 20 70 49 74 65 6d 3c 70 54 68 69 73 3b  >a; pItem<pThis;
2bfa0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
2bfb0 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
2bfc0 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
2bfd0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2bfe0 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2bff0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c000 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
2c010 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
2c020 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2c030 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e 7a  stricmp(pItem->z
2c040 44 61 74 61 62 61 73 65 2c 20 70 54 68 69 73 2d  Database, pThis-
2c050 3e 7a 44 61 74 61 62 61 73 65 29 21 3d 30 20 29  >zDatabase)!=0 )
2c060 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2c070 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2c080 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
2c090 20 70 54 68 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d   pThis->zName)!=
2c0a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2c0b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2c0c0 72 43 6f 6d 70 61 72 65 28 30 2c 20 0a 20 20 20  rCompare(0, .   
2c0d0 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 53         pThis->pS
2c0e0 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 70  elect->pWhere, p
2c0f0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
2c100 57 68 65 72 65 2c 20 2d 31 29 20 0a 20 20 20 20  Where, -1) .    
2c110 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2c120 76 69 65 77 20 77 61 73 20 6d 6f 64 69 66 69 65  view was modifie
2c130 64 20 62 79 20 73 6f 6d 65 20 6f 74 68 65 72 20  d by some other 
2c140 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 75 63  optimization suc
2c150 68 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 70 75  h as.      ** pu
2c160 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
2c170 28 29 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  () */.      cont
2c180 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
2c190 72 65 74 75 72 6e 20 70 49 74 65 6d 3b 0a 20 20  return pItem;.  
2c1a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
2c1b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
2c1c0 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d  OUNTOFVIEW_OPTIM
2c1d0 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74  IZATION./*.** At
2c1e0 74 65 6d 70 74 20 74 6f 20 74 72 61 6e 73 66 6f  tempt to transfo
2c1f0 72 6d 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  rm a query of th
2c200 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
2c210 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2c220 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46  FROM (SELECT x F
2c230 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
2c240 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
2c250 32 29 0a 2a 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68  2).**.** Into th
2c260 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
2c270 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  ECT (SELECT coun
2c280 74 28 2a 29 20 46 52 4f 4d 20 74 31 29 2b 28 53  t(*) FROM t1)+(S
2c290 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
2c2a0 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68  ROM t2).**.** Th
2c2b0 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  e transformation
2c2c0 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20 61   only works if a
2c2d0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
2c2e0 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
2c2f0 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 73 75 62  .**   *  The sub
2c300 71 75 65 72 79 20 69 73 20 61 20 55 4e 49 4f 4e  query is a UNION
2c310 20 41 4c 4c 20 6f 66 20 74 77 6f 20 6f 72 20 6d   ALL of two or m
2c320 6f 72 65 20 74 65 72 6d 73 0a 2a 2a 20 20 20 2a  ore terms.**   *
2c330 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 57 48    There is no WH
2c340 45 52 45 20 6f 72 20 47 52 4f 55 50 20 42 59 20  ERE or GROUP BY 
2c350 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  or HAVING clause
2c360 73 20 6f 6e 20 74 68 65 20 73 75 62 71 75 65 72  s on the subquer
2c370 69 65 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20  ies.**   *  The 
2c380 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 61  outer query is a
2c390 20 73 69 6d 70 6c 65 20 63 6f 75 6e 74 28 2a 29   simple count(*)
2c3a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
2c3b0 55 45 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69  UE if the optimi
2c3c0 7a 61 74 69 6f 6e 20 69 73 20 75 6e 64 65 72 74  zation is undert
2c3d0 61 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aken..*/.static 
2c3e0 69 6e 74 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f  int countOfViewO
2c3f0 70 74 69 6d 69 7a 61 74 69 6f 6e 28 50 61 72 73  ptimization(Pars
2c400 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
2c410 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20  t *p){.  Select 
2c420 2a 70 53 75 62 2c 20 2a 70 50 72 69 6f 72 3b 0a  *pSub, *pPrior;.
2c430 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
2c440 20 45 78 70 72 20 2a 70 43 6f 75 6e 74 3b 0a 20   Expr *pCount;. 
2c450 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2c460 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
2c470 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2c480 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2c490 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
2c4a0 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 69  aggregate */.  i
2c4b0 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  f( p->pEList->nE
2c4c0 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
2c4d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c4e0 20 2f 2a 20 53 69 6e 67 6c 65 20 72 65 73 75 6c   /* Single resul
2c4f0 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45  t column */.  pE
2c500 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
2c510 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
2c520 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
2c530 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
2c540 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2c550 20 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 6e   /* Result is an
2c560 20 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20   aggregate */.  
2c570 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2c580 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  cmp(pExpr->u.zTo
2c590 6b 65 6e 2c 22 63 6f 75 6e 74 22 29 20 29 20 72  ken,"count") ) r
2c5a0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 49 73 20  eturn 0;  /* Is 
2c5b0 63 6f 75 6e 74 28 29 20 2a 2f 0a 20 20 69 66 28  count() */.  if(
2c5c0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 21   pExpr->x.pList!
2c5d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c5f0 2a 20 4d 75 73 74 20 62 65 20 63 6f 75 6e 74 28  * Must be count(
2c600 2a 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  *) */.  if( p->p
2c610 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  Src->nSrc!=1 ) r
2c620 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2c630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2c640 20 74 61 62 6c 65 20 69 6e 20 46 52 4f 4d 20 20   table in FROM  
2c650 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  */.  pSub = p->p
2c660 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2c670 74 3b 0a 20 20 69 66 28 20 70 53 75 62 3d 3d 30  t;.  if( pSub==0
2c680 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
2c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52         /* The FR
2c6b0 4f 4d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  OM is a subquery
2c6c0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
2c6d0 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75  pPrior==0 ) retu
2c6e0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
2c6f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2c700 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 72 79  be a compound ry
2c710 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66   */.  do{.    if
2c720 28 20 70 53 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41  ( pSub->op!=TK_A
2c730 4c 4c 20 26 26 20 70 53 75 62 2d 3e 70 50 72 69  LL && pSub->pPri
2c740 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
2c750 2f 2a 20 4d 75 73 74 20 62 65 20 55 4e 49 4f 4e  /* Must be UNION
2c760 20 41 4c 4c 20 2a 2f 0a 20 20 20 20 69 66 28 20   ALL */.    if( 
2c770 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29 20 72  pSub->pWhere ) r
2c780 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c7a0 20 4e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   No WHERE clause
2c7b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
2c7c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2c7d0 41 67 67 72 65 67 61 74 65 20 29 20 72 65 74 75  Aggregate ) retu
2c7e0 72 6e 20 30 3b 20 20 20 20 20 2f 2a 20 4e 6f 74  rn 0;     /* Not
2c7f0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 2a 2f   an aggregate */
2c800 0a 20 20 20 20 70 53 75 62 20 3d 20 70 53 75 62  .    pSub = pSub
2c810 2d 3e 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20  ->pPrior;       
2c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c830 20 20 20 20 20 20 20 2f 2a 20 52 65 70 65 61 74         /* Repeat
2c840 20 6f 76 65 72 20 63 6f 6d 70 6f 75 6e 64 20 2a   over compound *
2c850 2f 0a 20 20 7d 77 68 69 6c 65 28 20 70 53 75 62  /.  }while( pSub
2c860 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
2c870 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
2c880 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 74   then it is OK t
2c890 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 74 72  o perform the tr
2c8a0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a  ansformation */.
2c8b0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
2c8c0 64 62 3b 0a 20 20 70 43 6f 75 6e 74 20 3d 20 70  db;.  pCount = p
2c8d0 45 78 70 72 3b 0a 20 20 70 45 78 70 72 20 3d 20  Expr;.  pExpr = 
2c8e0 30 3b 0a 20 20 70 53 75 62 20 3d 20 70 2d 3e 70  0;.  pSub = p->p
2c8f0 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
2c900 74 3b 0a 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  t;.  p->pSrc->a[
2c910 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  0].pSelect = 0;.
2c920 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
2c930 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 53  Delete(db, p->pS
2c940 72 63 29 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d  rc);.  p->pSrc =
2c950 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2c960 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
2c970 20 73 69 7a 65 6f 66 28 2a 70 2d 3e 70 53 72 63   sizeof(*p->pSrc
2c980 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 75  ));.  while( pSu
2c990 62 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  b ){.    Expr *p
2c9a0 54 65 72 6d 3b 0a 20 20 20 20 70 50 72 69 6f 72  Term;.    pPrior
2c9b0 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b   = pSub->pPrior;
2c9c0 0a 20 20 20 20 70 53 75 62 2d 3e 70 50 72 69 6f  .    pSub->pPrio
2c9d0 72 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  r = 0;.    pSub-
2c9e0 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
2c9f0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  pSub->selFlags |
2ca00 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
2ca10 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61      pSub->selFla
2ca20 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
2ca30 6e 64 3b 0a 20 20 20 20 70 53 75 62 2d 3e 6e 53  nd;.    pSub->nS
2ca40 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
2ca50 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2ca60 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
2ca70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  ->pEList);.    p
2ca80 54 65 72 6d 20 3d 20 70 50 72 69 6f 72 20 3f 20  Term = pPrior ? 
2ca90 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
2caa0 62 2c 20 70 43 6f 75 6e 74 2c 20 30 29 20 3a 20  b, pCount, 0) : 
2cab0 70 43 6f 75 6e 74 3b 0a 20 20 20 20 70 53 75 62  pCount;.    pSub
2cac0 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
2cad0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
2cae0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 65 72  (pParse, 0, pTer
2caf0 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m);.    pTerm = 
2cb00 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2cb10 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20  rse, TK_SELECT, 
2cb20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
2cb30 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74  e3PExprAddSelect
2cb40 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
2cb50 70 53 75 62 29 3b 0a 20 20 20 20 69 66 28 20 70  pSub);.    if( p
2cb60 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
2cb70 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 3b 0a   pExpr = pTerm;.
2cb80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cb90 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
2cba0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2cbb0 5f 50 4c 55 53 2c 20 70 54 65 72 6d 2c 20 70 45  _PLUS, pTerm, pE
2cbc0 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  xpr);.    }.    
2cbd0 70 53 75 62 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pSub = pPrior;. 
2cbe0 20 7d 0a 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e   }.  p->pEList->
2cbf0 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 70 45 78  a[0].pExpr = pEx
2cc00 70 72 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67  pr;.  p->selFlag
2cc10 73 20 26 3d 20 7e 53 46 5f 41 67 67 72 65 67 61  s &= ~SF_Aggrega
2cc20 74 65 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  te;..#if SELECTT
2cc30 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2cc40 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2cc50 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
2cc60 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
2cc70 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
2cc80 28 22 41 66 74 65 72 20 63 6f 75 6e 74 2d 6f 66  ("After count-of
2cc90 2d 76 69 65 77 20 6f 70 74 69 6d 69 7a 61 74 69  -view optimizati
2cca0 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
2ccb0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2ccc0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2ccd0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2cce0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
2ccf0 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
2cd00 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
2cd10 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72   */../*.** Gener
2cd20 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
2cd30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2cd40 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
2cd50 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
2cd60 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
2cd70 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
2cd80 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
2cd90 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
2cda0 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
2cdb0 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
2cdc0 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
2cdd0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
2cde0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2cdf0 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
2ce00 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
2ce10 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
2ce20 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
2ce30 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
2ce40 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
2ce50 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
2ce60 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
2ce70 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2ce80 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
2ce90 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
2cea0 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
2ceb0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
2cec0 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
2ced0 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
2cee0 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
2cef0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2cf00 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2cf10 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2cf20 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cf40 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
2cf50 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
2cf60 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
2cf70 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
2cf80 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
2cf90 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
2cfa0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
2cfb0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2cfc0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2cfd0 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
2cfe0 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
2cff0 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
2d000 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2d010 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
2d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d030 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
2d040 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
2d050 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
2d060 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
2d070 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2d080 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
2d090 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
2d0a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2d0b0 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74  st = 0;  /* List
2d0c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
2d0d0 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
2d0e0 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
2d0f0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2d100 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
2d110 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
2d120 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
2d130 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
2d140 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2d150 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
2d160 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
2d170 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
2d180 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2d190 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
2d1a0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
2d1b0 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
2d1c0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2d1d0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
2d1e0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
2d1f0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
2d200 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
2d210 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
2d220 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
2d230 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
2d240 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
2d250 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
2d260 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
2d270 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
2d280 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
2d290 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2d2a0 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
2d2b0 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
2d2c0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
2d2d0 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
2d2e0 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
2d2f0 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
2d300 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2d310 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
2d320 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
2d330 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2d340 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2d350 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2d360 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2d370 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
2d380 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
2d390 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2d3a0 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
2d3b0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
2d3c0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
2d3d0 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
2d3e0 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
2d3f0 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
2d400 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2d410 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
2d420 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
2d430 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
2d440 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
2d450 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
2d460 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
2d470 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
2d480 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
2d490 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
2d4a0 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  fo));.#if SELECT
2d4b0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2d4c0 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
2d4d0 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43  ndent++;.  SELEC
2d4e0 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2d4f0 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65  p, ("begin proce
2d500 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69  ssing:\n"));.  i
2d510 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2d520 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2d530 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2d540 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2d550 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2d560 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2d570 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2d580 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2d590 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
2d5a0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2d5b0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2d5c0 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
2d5d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2d5e0 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2d5f0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2d600 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
2d610 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
2d620 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
2d630 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
2d640 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
2d650 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
2d660 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
2d670 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2d680 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
2d690 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
2d6a0 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
2d6b0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2d6c0 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
2d6d0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2d6e0 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
2d6f0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2d700 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
2d710 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2d720 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
2d730 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2d740 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2d750 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
2d760 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
2d770 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
2d780 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
2d790 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
2d7a0 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
2d7b0 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
2d7c0 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
2d7d0 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
2d7e0 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
2d7f0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2d800 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
2d810 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
2d820 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
2d830 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2d840 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
2d850 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
2d860 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
2d870 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
2d880 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
2d890 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
2d8a0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2d8b0 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
2d8c0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
2d8d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2d8e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d8f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
2d900 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61  ect_end;.  }.  a
2d910 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
2d920 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d  !=0 );.  isAgg =
2d930 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2d940 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
2d950 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2d960 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2d970 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2d980 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2d990 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2d9a0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  100,pParse,p, ("
2d9b0 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
2d9c0 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ution:\n"));.   
2d9d0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2d9e0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2d9f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2da00 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
2da10 74 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63  the VDBE under c
2da20 6f 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c  onstruction, all
2da30 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56 44  ocating a new VD
2da40 42 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64  BE if one.  ** d
2da50 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
2da60 65 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73  exist */.  v = s
2da70 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
2da80 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
2da90 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
2daa0 65 6e 64 3b 0a 20 20 69 66 28 20 70 44 65 73 74  end;.  if( pDest
2dab0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
2dac0 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  put ){.    gener
2dad0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
2dae0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a  Parse, p);.  }..
2daf0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 6c 61 74    /* Try to flat
2db00 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 69  ten subqueries i
2db10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2db20 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61  e up into the ma
2db30 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69  in query.  */.#i
2db40 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
2db50 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
2db60 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2db70 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20  ITE_OMIT_VIEW). 
2db80 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50   for(i=0; !p->pP
2db90 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69  rior && i<pTabLi
2dba0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2dbb0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2dbc0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2dbd0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2dbe0 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
2dbf0 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ub = pItem->pSel
2dc00 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41  ect;.    int isA
2dc10 67 67 53 75 62 3b 0a 20 20 20 20 54 61 62 6c 65  ggSub;.    Table
2dc20 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
2dc30 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 53  pTab;.    if( pS
2dc40 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2dc50 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20  ;..    /* Catch 
2dc60 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20  mismatch in the 
2dc70 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73  declared columns
2dc80 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74   of a view and t
2dc90 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
2dca0 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
2dcb0 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65  he SELECT on the
2dcc0 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20   RHS */.    if( 
2dcd0 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62  pTab->nCol!=pSub
2dce0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
2dcf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2dd00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2dd10 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f   "expected %d co
2dd20 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62  lumns for '%s' b
2dd30 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20  ut got %d",.    
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd50 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54    pTab->nCol, pT
2dd60 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d  ab->zName, pSub-
2dd70 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
2dd80 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
2dd90 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
2dda0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62     /* If the sub
2ddb0 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
2ddc0 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
2ddd0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 61 6e  OUP BY clause an
2dde0 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77  d if.    ** it w
2ddf0 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  ill be implement
2de00 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
2de10 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  ne, then do not 
2de20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20  flatten.  This. 
2de30 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f     ** restrictio
2de40 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e  n allows SQL con
2de50 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69  structs like thi
2de60 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2de70 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69    SELECT expensi
2de80 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20  ve_function(x). 
2de90 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53     **    FROM (S
2dea0 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
2deb0 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49   ORDER BY y LIMI
2dec0 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  T 10);.    **.  
2ded0 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69    ** The expensi
2dee0 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  ve_function() is
2def0 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f   only computed o
2df00 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68  n the 10 rows th
2df10 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75  at.    ** are ou
2df20 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61  tput, rather tha
2df30 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74  n every row of t
2df40 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
2df50 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e  .    if( (pSub->
2df60 70 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 70  pOrderBy!=0 || p
2df70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 21 3d 30  Sub->pGroupBy!=0
2df80 29 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20  ).     && i==0. 
2df90 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
2dfa0 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
2dfb0 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
2dfc0 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
2dfd0 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
2dfe0 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 20 26  OSS))!=0).     &
2dff0 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  & OptimizationEn
2e000 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
2e010 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a  _SubqCoroutine).
2e020 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
2e030 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
2e040 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53    isAggSub = (pS
2e050 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
2e060 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
2e070 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e  .    if( flatten
2e080 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c  Subquery(pParse,
2e090 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73   p, i, isAgg, is
2e0a0 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20  AggSub) ){.     
2e0b0 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72   /* This subquer
2e0c0 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65  y can be absorbe
2e0d0 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e  d into its paren
2e0e0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  t. */.      if( 
2e0f0 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20  isAggSub ){.    
2e100 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20      isAgg = 1;. 
2e110 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61         p->selFla
2e120 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
2e130 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
2e140 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    i = -1;.    }.
2e150 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
2e160 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
2e170 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2e180 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2e190 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  nd;.    if( !Ign
2e1a0 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
2e1b0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53  est) ){.      sS
2e1c0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70  ort.pOrderBy = p
2e1d0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
2e1e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
2e1f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e200 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2e210 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f  T.  /* Handle co
2e220 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
2e230 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74  atements using t
2e240 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74  he separate mult
2e250 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70  iSelect().  ** p
2e260 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20  rocedure..  */. 
2e270 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
2e280 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69  {.    rc = multi
2e290 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2e2a0 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78  , pDest);.    ex
2e2b0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2e2c0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2e2d0 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2e2e0 74 49 64 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  tId);.#if SELECT
2e2f0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2e300 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
2e310 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63  pParse,p,("end c
2e320 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70  ompound-select p
2e330 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
2e340 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c      pParse->nSel
2e350 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e  ectIndent--;.#en
2e360 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 72  dif.    return r
2e370 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
2e380 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65 72   /* For each ter
2e390 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  m in the FROM cl
2e3a0 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68 69  ause, do two thi
2e3b0 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75  ngs:.  ** (1) Au
2e3c0 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65 72  thorized unrefer
2e3d0 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20 2a  enced tables.  *
2e3e0 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20 63  * (2) Generate c
2e3f0 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
2e400 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66  queries.  */.  f
2e410 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
2e420 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
2e430 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2e440 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2e450 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d   &pTabList->a[i]
2e460 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74  ;.    SelectDest
2e470 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63   dest;.    Selec
2e480 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64 65  t *pSub;.#if !de
2e490 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2e4a0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
2e4b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2e4c0 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63 6f  MIT_VIEW).    co
2e4d0 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
2e4e0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e  AuthContext;.#en
2e4f0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75  dif..    /* Issu
2e500 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75  e SQLITE_READ au
2e510 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69 74  thorizations wit
2e520 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20  h a fake column 
2e530 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20 20  name for any.   
2e540 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74 20   ** tables that 
2e550 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 20 62  are referenced b
2e560 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f  ut from which no
2e570 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72   values are extr
2e580 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45 78  acted..    ** Ex
2e590 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65 20  amples of where 
2e5a0 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20 6e  these kinds of n
2e5b0 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44 20  ull SQLITE_READ 
2e5c0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a 20  authorizations. 
2e5d0 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63 75     ** would occu
2e5e0 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r:.    **.    **
2e5f0 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
2e600 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  t(*) FROM t1;   
2e610 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20 74  -- SQLITE_READ t
2e620 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20 20  1."".    **     
2e630 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f 4d  SELECT t1.* FROM
2e640 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53 51   t1, t2;   -- SQ
2e650 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22 0a  LITE_READ t2."".
2e660 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2e670 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
2e680 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  me is an empty s
2e690 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70 6f  tring.  It is po
2e6a0 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61 62  ssible for a tab
2e6b0 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61 76  le to.    ** hav
2e6c0 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64  e a column named
2e6d0 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73 74   by the empty st
2e6e0 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20 63  ring, in which c
2e6f0 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
2e700 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  way to.    ** di
2e710 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65 65  stinguish betwee
2e720 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63 65  n an unreference
2e730 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20 61  d table and an a
2e740 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65 20  ctual reference 
2e750 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22 22  to the.    ** ""
2e760 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72 69   column. The ori
2e770 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61 73  ginal design was
2e780 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f   for the fake co
2e790 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65 20  lumn name to be 
2e7a0 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77  a NULL,.    ** w
2e7b0 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75 6e  hich would be un
2e7c0 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74 20  ambiguous.  But 
2e7d0 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a 61  legacy authoriza
2e7e0 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20 6d  tion callbacks m
2e7f0 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73 75  ight.    ** assu
2e800 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  me the column na
2e810 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  me is non-NULL a
2e820 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54 68  nd segfault.  Th
2e830 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70 74  e use of an empt
2e840 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67 20  y.    ** string 
2e850 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c  for the fake col
2e860 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20 73  umn name seems s
2e870 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  afer..    */.   
2e880 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c 55   if( pItem->colU
2e890 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sed==0 ){.      
2e8a0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
2e8b0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
2e8c0 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  READ, pItem->zNa
2e8d0 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e 7a  me, "", pItem->z
2e8e0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d  Database);.    }
2e8f0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
2e900 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2e910 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
2e920 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
2e930 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  W).    /* Genera
2e940 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
2e950 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
2e960 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
2e970 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d     */.    pSub =
2e980 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
2e990 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
2e9a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
2e9b0 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
2e9c0 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
2e9d0 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
2e9e0 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
2e9f0 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
2ea00 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
2ea10 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
2ea20 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
2ea30 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
2ea40 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
2ea50 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
2ea60 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
2ea70 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
2ea80 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
2ea90 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
2eaa0 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
2eab0 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
2eac0 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
2ead0 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
2eae0 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
2eaf0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
2eb00 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
2eb10 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
2eb20 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
2eb30 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
2eb40 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2eb50 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
2eb60 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
2eb70 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20  routine==0 ){.  
2eb80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62        /* The sub
2eb90 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6e  routine that man
2eba0 69 66 65 73 74 73 20 74 68 65 20 76 69 65 77 20  ifests the view 
2ebb0 6d 69 67 68 74 20 62 65 20 61 20 6f 6e 65 2d 74  might be a one-t
2ebc0 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20  ime routine,.   
2ebd0 20 20 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d 69       ** or it mi
2ebe0 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ght need to be r
2ebf0 65 72 75 6e 20 6f 6e 20 65 61 63 68 20 69 74 65  erun on each ite
2ec00 72 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 69  ration because i
2ec10 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e 63  t.        ** enc
2ec20 6f 64 65 73 20 61 20 63 6f 72 72 65 6c 61 74 65  odes a correlate
2ec30 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20  d subquery. */. 
2ec40 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ec50 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
2ec60 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72  p(v, pItem->addr
2ec70 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64 65  FillSub)->opcode
2ec80 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20 20  ==OP_Once );.   
2ec90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2eca0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2ecb0 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
2ecc0 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
2ecd0 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
2ece0 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
2ecf0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
2ed00 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
2ed10 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
2ed20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
2ed30 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
2ed40 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
2ed50 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
2ed60 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
2ed70 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
2ed80 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
2ed90 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
2eda0 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
2edb0 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
2edc0 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
2edd0 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
2ede0 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
2edf0 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
2ee00 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
2ee10 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
2ee20 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
2ee30 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
2ee40 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
2ee50 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
2ee60 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2ee70 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
2ee80 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2ee90 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f  ..    /* Make co
2eea0 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74  pies of constant
2eeb0 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74 65   WHERE-clause te
2eec0 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  rms in the outer
2eed0 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20 20   query down.    
2eee0 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73 75  ** inside the su
2eef0 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63 61  bquery.  This ca
2ef00 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71 75  n help the subqu
2ef10 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20  ery to run more 
2ef20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20  efficiently..   
2ef30 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74   */.    if( (pIt
2ef40 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
2ef50 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d 30 0a 20  & JT_OUTER)==0. 
2ef60 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
2ef70 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65  hereTerms(pParse
2ef80 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
2ef90 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
2efa0 72 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45  r).    ){.#if SE
2efb0 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2efc0 44 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  D.      if( sqli
2efd0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
2efe0 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20   0x100 ){.      
2eff0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2f000 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  100,pParse,p,("A
2f010 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73  fter WHERE-claus
2f020 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29  e push-down:\n")
2f030 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2f040 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2f050 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20  (0, p, 0);.     
2f060 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2f070 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74 68 43  .    zSavedAuthC
2f080 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
2f090 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20  >zAuthContext;. 
2f0a0 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
2f0b0 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d  Context = pItem-
2f0c0 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20  >zName;..    /* 
2f0d0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
2f0e0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 73   implement the s
2f0f0 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20  ubquery.    **. 
2f100 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75 65     ** The subque
2f110 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ry is implemente
2f120 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
2f130 65 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  e if all of thes
2f140 65 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  e are true:.    
2f150 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
2f160 62 71 75 65 72 79 20 69 73 20 67 75 61 72 61 6e  bquery is guaran
2f170 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f  teed to be the o
2f180 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68  uter loop (so th
2f190 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 20 20 20  at it.    **    
2f1a0 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65      does not nee
2f1b0 64 20 74 6f 20 62 65 20 63 6f 6d 70 75 74 65 64  d to be computed
2f1c0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 29   more than once)
2f1d0 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 52  .    **   (2)  R
2f1e0 45 4d 4f 56 45 44 20 28 32 30 31 37 2d 30 39 2d  EMOVED (2017-09-
2f1f0 32 38 29 3a 20 54 68 65 20 41 4c 4c 20 6b 65 79  28): The ALL key
2f200 77 6f 72 64 20 61 66 74 65 72 20 53 45 4c 45 43  word after SELEC
2f210 54 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 20 20  T is omitted..  
2f220 20 20 2a 2a 20 20 20 28 33 29 20 20 43 6f 2d 72    **   (3)  Co-r
2f230 6f 75 74 69 6e 65 73 20 61 72 65 20 6e 6f 74 20  outines are not 
2f240 64 69 73 61 62 6c 65 64 20 75 73 69 6e 67 20 73  disabled using s
2f250 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2f260 72 6f 6c 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  rol().    **    
2f270 20 20 20 20 77 69 74 68 20 53 51 4c 49 54 45 5f      with SQLITE_
2f280 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
2f290 41 54 49 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20  ATIONS..    **. 
2f2a0 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20     ** TODO: Are 
2f2b0 74 68 65 72 65 20 6f 74 68 65 72 20 72 65 61 73  there other reas
2f2c0 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29 20 74  ons beside (1) t
2f2d0 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69  o use a co-routi
2f2e0 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d  ne.    ** implem
2f2f0 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f  entation?.    */
2f300 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20  .    if( i==0.  
2f310 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d     && (pTabList-
2f320 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20  >nSrc==1.       
2f330 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73       || (pTabLis
2f340 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74  t->a[1].fg.joint
2f350 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  ype&(JT_LEFT|JT_
2f360 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20  CROSS))!=0)  /* 
2f370 28 31 29 20 2a 2f 0a 20 20 20 20 20 2f 2a 2a 2a  (1) */.     /***
2f380 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 6d 6f   constraint remo
2f390 76 65 64 3a 20 26 26 20 28 70 2d 3e 73 65 6c 46  ved: && (p->selF
2f3a0 6c 61 67 73 20 26 20 53 46 5f 41 6c 6c 29 3d 3d  lags & SF_All)==
2f3b0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 28 32  0             (2
2f3c0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 4f 70 74  ) */.     && Opt
2f3d0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
2f3e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71  (db, SQLITE_Subq
2f3f0 43 6f 72 6f 75 74 69 6e 65 29 20 20 20 20 20 20  Coroutine)      
2f400 20 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20           /* (3) 
2f410 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
2f420 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63  /* Implement a c
2f430 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  o-routine that w
2f440 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e  ill return a sin
2f450 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
2f460 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
2f470 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63  et on each invoc
2f480 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
2f490 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
2f4a0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
2f4b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
2f4c0 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70 49 74  .     .      pIt
2f4d0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
2f4e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2f4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f500 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
2f510 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  itCoroutine, pIt
2f520 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30  em->regReturn, 0
2f530 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
2f540 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2f550 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  , "%s", pItem->p
2f560 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2f570 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
2f580 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
2f590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2f5a0 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
2f5b0 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
2f5c0 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2f5d0 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70  turn);.      exp
2f5e0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2f5f0 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2f600 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2f610 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2f620 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
2f630 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26  (pParse, pSub, &
2f640 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  dest);.      pIt
2f650 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
2f660 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
2f670 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 70  lectRow;.      p
2f680 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2f690 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  utine = 1;.     
2f6a0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c   pItem->regResul
2f6b0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
2f6c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2f6d0 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
2f6e0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2f6f0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
2f700 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2f710 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20   addrTop-1);.   
2f720 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
2f730 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
2f740 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se);.    }else{.
2f750 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2f760 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
2f770 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e  hat will fill an
2f780 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
2f790 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74   with.      ** t
2f7a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
2f7b0 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70 49  is subquery.  pI
2f7c0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
2f7d0 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20   will point.    
2f7e0 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72    ** to the addr
2f7f0 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ess of the gener
2f800 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e  ated subroutine.
2f810 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2f820 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  rn.      ** is a
2f830 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61   register alloca
2f840 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ted to hold the 
2f850 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
2f860 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20 20  n address.      
2f870 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  */.      int top
2f880 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  Addr;.      int 
2f890 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20  onceAddr = 0;.  
2f8a0 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b      int retAddr;
2f8b0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
2f8c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72 69  cList_item *pPri
2f8d0 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  or;..      asser
2f8e0 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  t( pItem->addrFi
2f8f0 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20  llSub==0 );.    
2f900 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
2f910 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
2f920 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64  Mem;.      topAd
2f930 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2f940 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2f950 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e  eger, 0, pItem->
2f960 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
2f970 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
2f980 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31  lSub = topAddr+1
2f990 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
2f9a0 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  m->fg.isCorrelat
2f9b0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
2f9c0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
2f9d0 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
2f9e0 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
2f9f0 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
2fa00 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
2fa10 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
2fa20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
2fa30 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
2fa40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
2fa50 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
2fa60 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
2fa70 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
2fa80 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e  eAddOp0(v, OP_On
2fa90 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ce); VdbeCoverag
2faa0 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56 64  e(v);.        Vd
2fab0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  beComment((v, "m
2fac0 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c  aterialize \"%s\
2fad0 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  "", pItem->pTab-
2fae0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
2faf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56  }else{.        V
2fb00 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
2fb10 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20  v, "materialize 
2fb20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e  \"%s\"", pItem->
2fb30 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
2fb40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 72       }.      pPr
2fb50 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e  ior = isSelfJoin
2fb60 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20 70  View(pTabList, p
2fb70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Item);.      if(
2fb80 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20   pPrior ){.     
2fb90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2fba0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44  dOp2(v, OP_OpenD
2fbb0 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  up, pItem->iCurs
2fbc0 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75 72  or, pPrior->iCur
2fbd0 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  sor);.        ex
2fbe0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2fbf0 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
2fc00 2c 20 70 50 72 69 6f 72 2d 3e 69 53 65 6c 65 63  , pPrior->iSelec
2fc10 74 49 64 29 3b 0a 20 20 20 20 20 20 20 20 61 73  tId);.        as
2fc20 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 53  sert( pPrior->pS
2fc30 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20 20  elect!=0 );.    
2fc40 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63      pSub->nSelec
2fc50 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70  tRow = pPrior->p
2fc60 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52  Select->nSelectR
2fc70 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ow;.      }else{
2fc80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fc90 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
2fca0 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d 54  dest, SRT_EphemT
2fcb0 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  ab, pItem->iCurs
2fcc0 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  or);.        exp
2fcd0 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2fce0 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c  Item->iSelectId,
2fcf0 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65   (u8)pParse->iNe
2fd00 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
2fd10 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2fd20 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
2fd30 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   &dest);.      }
2fd40 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
2fd50 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
2fd60 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
2fd70 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  w;.      if( onc
2fd80 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
2fd90 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
2fda0 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
2fdb0 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
2fdc0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2fdd0 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
2fde0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
2fdf0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2fe00 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
2fe10 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2fe20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2fe30 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
2fe40 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
2fe50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2fe60 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
2fe70 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
2fe80 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
2fe90 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
2fea0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2feb0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
2fec0 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
2fed0 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
2fee0 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
2fef0 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
2ff00 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
2ff10 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56  ndif.  }..  /* V
2ff20 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20  arious elements 
2ff30 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f  of the SELECT co
2ff40 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20  pied into local 
2ff50 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20  variables for.  
2ff60 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a  ** convenience *
2ff70 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  /.  pEList = p->
2ff80 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65  pEList;.  pWhere
2ff90 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
2ffa0 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47  pGroupBy = p->pG
2ffb0 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e  roupBy;.  pHavin
2ffc0 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a  g = p->pHaving;.
2ffd0 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e    sDistinct.isTn
2ffe0 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ct = (p->selFlag
2fff0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
30000 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  !=0;..#if SELECT
30010 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
30020 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
30030 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  tTrace & 0x400 )
30040 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
30050 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70  E(0x400,pParse,p
30060 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f  ,("After all FRO
30070 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69  M-clause analysi
30080 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c  s:\n"));.    sql
30090 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
300a0 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d  ct(0, p, 0);.  }
300b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
300c0 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49  SQLITE_COUNTOFVI
300d0 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EW_OPTIMIZATION.
300e0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
300f0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
30100 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
30110 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74  ner|SQLITE_Count
30120 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20 63 6f  OfView).   && co
30130 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a  untOfViewOptimiz
30140 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 29  ation(pParse, p)
30150 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  .  ){.    if( db
30160 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
30170 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
30180 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
30190 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 54  ->pEList;.    pT
301a0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
301b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
301c0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
301d0 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68  is DISTINCT with
301e0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74   an ORDER BY but
301f0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
30200 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20  gate, and .  ** 
30210 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69  if the select-li
30220 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  st is the same a
30230 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c  s the ORDER BY l
30240 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71  ist, then this q
30250 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65  uery.  ** can be
30260 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
30270 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68  GROUP BY. In oth
30280 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a  er words, this:.
30290 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
302a0 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79  LECT DISTINCT xy
302b0 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52  z FROM ... ORDER
302c0 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
302d0 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  * is transformed
302e0 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
302f0 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52     SELECT xyz FR
30300 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20  OM ... GROUP BY 
30310 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a  xyz ORDER BY xyz
30320 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
30330 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72  econd form is pr
30340 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e  eferred as a sin
30350 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65  gle index (or te
30360 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65  mp-table) may be
30370 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20   .  ** used for 
30380 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  both the ORDER B
30390 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70  Y and DISTINCT p
303a0 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72  rocessing. As or
303b0 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77  iginally .  ** w
303c0 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79  ritten the query
303d0 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70   must use a temp
303e0 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65  -table for at le
303f0 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f  ast one of the O
30400 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e  RDER .  ** BY an
30410 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20  d DISTINCT, and 
30420 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61  an index or sepa
30430 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20  rate temp-table 
30440 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20  for the other.. 
30450 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
30460 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
30470 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
30480 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
30490 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t .   && sqlite3
304a0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
304b0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
304c0 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20  pEList, -1)==0. 
304d0 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
304e0 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
304f0 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42  nct;.    pGroupB
30500 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  y = p->pGroupBy 
30510 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
30520 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
30530 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69   0);.    /* Noti
30540 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  ce that even tho
30550 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74  ught SF_Distinct
30560 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65   has been cleare
30570 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61  d from p->selFla
30580 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  gs,.    ** the s
30590 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
305a0 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48  is still set.  H
305b0 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70  ence, isTnct rep
305c0 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20  resents the.    
305d0 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74  ** original sett
305e0 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69  ing of the SF_Di
305f0 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74  stinct flag, not
30600 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74   the current set
30610 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65  ting */.    asse
30620 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  rt( sDistinct.is
30630 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c  Tnct );..#if SEL
30640 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
30650 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
30660 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
30670 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c  400 ){.      SEL
30680 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
30690 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73 66  Parse,p,("Transf
306a0 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e 74  orm DISTINCT int
306b0 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29  o GROUP BY:\n"))
306c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
306d0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
306e0 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65   p, 0);.    }.#e
306f0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ndif.  }..  /* I
30700 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
30710 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
30720 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70  hen create an ep
30730 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
30740 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72  .  ** do the sor
30750 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20  ting.  But this 
30760 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61  sorting ephemera
30770 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  l index might en
30780 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20  d up.  ** being 
30790 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
307a0 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63  ta can be extrac
307b0 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65  ted in pre-sorte
307c0 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66  d order..  ** If
307d0 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
307e0 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f  e, then the OP_O
307f0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
30800 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
30810 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f  .  ** changed to
30820 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
30830 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
30840 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
30850 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f  index is.  ** no
30860 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73  t needed.  The s
30870 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
30880 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  ex variable is u
30890 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74  sed to facilitat
308a0 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e  e.  ** that chan
308b0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ge..  */.  if( s
308c0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
308d0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
308e0 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79  eyInfo;.    pKey
308f0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
30900 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
30910 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
30920 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  y, 0, pEList->nE
30930 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e  xpr);.    sSort.
30940 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
30950 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
30960 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64  Sort.addrSortInd
30970 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74  ex =.      sqlit
30980 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
30990 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
309a0 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72  ,.          sSor
309b0 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72  t.iECursor, sSor
309c0 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
309d0 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r+1+pEList->nExp
309e0 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
309f0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
30a00 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20   P4_KEYINFO.    
30a10 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
30a20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
30a30 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a  Index = -1;.  }.
30a40 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74  .  /* If the out
30a50 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20  put is destined 
30a60 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20  for a temporary 
30a70 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74  table, open that
30a80 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
30a90 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  f( pDest->eDest=
30aa0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
30ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
30ac0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
30ad0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73  nEphemeral, pDes
30ae0 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69  t->iSDParm, pELi
30af0 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a  st->nExpr);.  }.
30b00 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69  .  /* Set the li
30b10 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45  miter..  */.  iE
30b20 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
30b30 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
30b40 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
30b50 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74   & SF_FixedLimit
30b60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  )==0 ){.    p->n
30b70 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b  SelectRow = 320;
30b80 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72    /* 4 billion r
30b90 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d  ows */.  }.  com
30ba0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
30bb0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45  rs(pParse, p, iE
30bc0 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  nd);.  if( p->iL
30bd0 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74  imit==0 && sSort
30be0 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d  .addrSortIndex>=
30bf0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
30c00 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
30c10 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f  (v, sSort.addrSo
30c20 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74  rtIndex, OP_Sort
30c30 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f  erOpen);.    sSo
30c40 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20  rt.sortFlags |= 
30c50 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
30c60 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  er;.  }..  /* Op
30c70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
30c80 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
30c90 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
30ca0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
30cb0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
30cc0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
30cd0 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
30ce0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
30cf0 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  +;.    sDistinct
30d00 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69  .addrTnct = sqli
30d10 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
30d20 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
30d30 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
30d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d50 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
30d60 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
30d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d80 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79        (char*)key
30d90 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
30da0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
30db0 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20  st,0,0),.       
30dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30dd0 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
30de0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
30df0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
30e00 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
30e10 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
30e20 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
30e30 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
30e40 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ED;.  }else{.   
30e50 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
30e60 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
30e70 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  TINCT_NOOP;.  }.
30e80 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
30e90 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
30ea0 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67      /* No aggreg
30eb0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
30ec0 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  d no GROUP BY cl
30ed0 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ause */.    u16 
30ee0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44  wctrlFlags = (sD
30ef0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f  istinct.isTnct ?
30f00 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
30f10 49 4e 43 54 20 3a 20 30 29 3b 0a 20 20 20 20 61  INCT : 0);.    a
30f20 73 73 65 72 74 28 20 57 48 45 52 45 5f 55 53 45  ssert( WHERE_USE
30f30 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64  _LIMIT==SF_Fixed
30f40 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 77 63 74  Limit );.    wct
30f50 72 6c 46 6c 61 67 73 20 7c 3d 20 70 2d 3e 73 65  rlFlags |= p->se
30f60 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65  lFlags & SF_Fixe
30f70 64 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  dLimit;..    /* 
30f80 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61  Begin the databa
30f90 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  se scan. */.    
30fa0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
30fb0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
30fc0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
30fd0 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  ere, sSort.pOrde
30fe0 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
30ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31000 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77      p->pEList, w
31010 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53  ctrlFlags, p->nS
31020 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69  electRow);.    i
31030 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
31040 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
31050 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
31060 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
31070 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e  nt(pWInfo) < p->
31080 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20  nSelectRow ){.  
31090 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
310a0 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  w = sqlite3Where
310b0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
310c0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
310d0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
310e0 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65  isTnct && sqlite
310f0 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
31100 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
31110 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
31120 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57  tType = sqlite3W
31130 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
31140 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
31150 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64    if( sSort.pOrd
31160 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53  erBy ){.      sS
31170 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c  ort.nOBSat = sql
31180 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
31190 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ed(pWInfo);.    
311a0 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72 65 64    sSort.bOrdered
311b0 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71 6c 69  InnerLoop = sqli
311c0 74 65 33 57 68 65 72 65 4f 72 64 65 72 65 64 49  te3WhereOrderedI
311d0 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66 6f 29  nnerLoop(pWInfo)
311e0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53 6f 72  ;.      if( sSor
311f0 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e  t.nOBSat==sSort.
31200 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
31210 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
31220 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
31230 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
31240 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
31250 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
31260 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
31270 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
31280 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
31290 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
312a0 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
312b0 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
312c0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
312d0 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
312e0 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
312f0 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  /.    if( sSort.
31300 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
31310 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72   && sSort.pOrder
31320 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  By==0 ){.      s
31330 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
31340 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e  ToNoop(v, sSort.
31350 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
31360 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
31370 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
31380 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
31390 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
313a0 69 73 74 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 20  ist==pEList );. 
313b0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
313c0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
313d0 2c 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74  , &sSort, &sDist
313e0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
313f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31400 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
31410 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66  tinueLabel(pWInf
31420 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
31430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
31440 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70  hereBreakLabel(p
31450 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a  WInfo));..    /*
31460 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   End the databas
31470 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
31480 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57   */.    sqlite3W
31490 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
314a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
314b0 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20   This case when 
314c0 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72  there exist aggr
314d0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
314e0 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c  or a GROUP BY cl
314f0 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62  ause.    ** or b
31500 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43  oth */.    NameC
31510 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f  ontext sNC;    /
31520 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
31530 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67  or processing ag
31540 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74  gregate informat
31550 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ion */.    int i
31560 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  AMem;          /
31570 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
31580 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ess for storing 
31590 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
315a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65   */.    int iBMe
315b0 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
315c0 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
315d0 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52   for previous GR
315e0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
315f0 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20  t iUseFlag;     
31600 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
31610 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e   holding flag in
31620 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74  dicating that at
31630 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20   least.         
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
31650 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  * one row of the
31660 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67   input to the ag
31670 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65  gregator has bee
31680 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
31690 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
316a0 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e  cessed */.    in
316b0 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20  t iAbortFlag;   
316c0 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73    /* Mem address
316d0 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75   which causes qu
316e0 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73  ery abort if pos
316f0 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74  itive */.    int
31700 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20   groupBySort;   
31710 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72   /* Rows come fr
31720 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f  om source in GRO
31730 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20  UP BY order */. 
31740 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20     int addrEnd; 
31750 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
31760 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
31770 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
31780 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20     int sortPTab 
31790 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f  = 0;   /* Pseudo
317a0 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65  table used to de
317b0 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73  code sorting res
317c0 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ults */.    int 
317d0 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20  sortOut = 0;    
317e0 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74  /* Output regist
317f0 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74  er from the sort
31800 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72  er */.    int or
31810 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a  derByGrp = 0; /*
31820 20 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f   True if the GRO
31830 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20  UP BY and ORDER 
31840 42 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  BY are the same 
31850 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
31860 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
31870 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
31880 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
31890 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
318a0 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
318b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
318c0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
318d0 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
318e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
318f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
31900 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
31910 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
31920 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
31930 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
31940 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
31950 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
31960 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
31970 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
31980 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
31990 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
319a0 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
319b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
319c0 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42     for(k=pGroupB
319d0 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  y->nExpr, pItem=
319e0 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30  pGroupBy->a; k>0
319f0 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
31a00 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
31a10 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
31a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
31a30 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65  sert( 66==sqlite
31a40 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a  3LogEst(100) );.
31a50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
31a60 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e  lectRow>66 ) p->
31a70 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b  nSelectRow = 66;
31a80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31a90 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
31aa0 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b  ite3LogEst(1) );
31ab0 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
31ac0 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  tRow = 0;.    }.
31ad0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
31ae0 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50   is both a GROUP
31af0 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52   BY and an ORDER
31b00 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
31b10 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69  hey are.    ** i
31b20 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69  dentical, then i
31b30 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c  t may be possibl
31b40 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  e to disable the
31b50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
31b60 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20   .    ** on the 
31b70 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65  grounds that the
31b80 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63   GROUP BY will c
31b90 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f  ause elements to
31ba0 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a   come out .    *
31bb0 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
31bc0 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20   order. It also 
31bd0 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52  may not - the GR
31be0 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65  OUP BY might use
31bf0 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61   a.    ** databa
31c00 73 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  se index that ca
31c10 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20  uses rows to be 
31c20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72  grouped together
31c30 20 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20   as required.   
31c40 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75   ** but not actu
31c50 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74  ally sorted. Eit
31c60 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20  her way, record 
31c70 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
31c80 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42  e.    ** ORDER B
31c90 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63  Y and GROUP BY c
31ca0 6c 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73  lauses are the s
31cb0 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74  ame by setting t
31cc0 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20  he orderByGrp.  
31cd0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20    ** variable.  
31ce0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
31cf0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
31d00 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72  e(pGroupBy, sSor
31d10 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  t.pOrderBy, -1)=
31d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65  =0 ){.      orde
31d30 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20  rByGrp = 1;.    
31d40 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  }. .    /* Creat
31d50 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
31d60 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
31d70 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
31d80 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
31d90 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
31da0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
31db0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
31dc0 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
31dd0 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
31de0 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
31df0 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
31e00 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
31e10 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
31e20 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
31e30 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
31e40 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
31e50 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
31e60 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
31e70 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
31e80 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
31e90 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
31ea0 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
31eb0 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
31ec0 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
31ed0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
31ee0 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
31ef0 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
31f00 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
31f10 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
31f20 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20  roupBy->nExpr : 
31f30 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
31f40 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
31f50 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
31f60 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
31f70 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
31f80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
31f90 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
31fa0 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64  &sNC, sSort.pOrd
31fb0 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
31fc0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
31fd0 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
31fe0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31ff0 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65 72  pWhere==p->pWher
32000 65 20 29 3b 0a 20 20 20 20 20 20 20 20 68 61 76  e );.        hav
32010 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61 72 73  ingToWhere(pPars
32020 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 48 61  e, pGroupBy, pHa
32030 76 69 6e 67 2c 20 26 70 2d 3e 70 57 68 65 72 65  ving, &p->pWhere
32040 29 3b 0a 20 20 20 20 20 20 20 20 70 57 68 65 72  );.        pWher
32050 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
32060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
32070 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
32080 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
32090 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
320a0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
320b0 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
320c0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
320d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
320e0 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
320f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
32100 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
32110 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
32120 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
32130 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
32140 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
32150 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20   NC_InAggFunc;. 
32160 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
32170 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
32180 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
32190 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
321a0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e  pList);.      sN
321b0 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
321c0 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
321d0 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  }.    sAggInfo.m
321e0 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xReg = pParse->n
321f0 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Mem;.    if( db-
32200 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
32210 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
32220 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
32230 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
32240 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
32250 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
32260 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
32270 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
32280 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
32290 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
322a0 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
322b0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
322c0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
322d0 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
322e0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
322f0 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
32300 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
32310 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
32320 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
32330 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
32340 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
32350 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
32360 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
32370 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
32380 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
32390 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
323a0 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
323b0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
323c0 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
323d0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
323e0 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
323f0 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
32400 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
32410 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
32420 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
32430 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
32440 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
32450 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
32460 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
32470 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
32480 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
32490 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
324a0 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
324b0 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
324c0 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
324d0 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
324e0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
324f0 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
32500 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
32510 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
32520 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
32530 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
32540 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
32550 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
32560 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
32570 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
32580 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
32590 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
325a0 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
325b0 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
325c0 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
325d0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
325e0 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
325f0 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
32600 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  en instruction. 
32610 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
32620 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
32630 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
32640 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
32650 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
32660 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
32670 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
32680 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
32690 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
326a0 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f  pBy, 0, sAggInfo
326b0 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  .nColumn);.     
326c0 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20   addrSortingIdx 
326d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
326e0 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op4(v, OP_Sorter
326f0 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  Open, .         
32700 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
32710 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e  gIdx, sAggInfo.n
32720 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a  SortingColumn, .
32730 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68            0, (ch
32740 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
32750 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
32760 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
32770 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73  memory locations
32780 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20 42   used by GROUP B
32790 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f 63  Y aggregate proc
327a0 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  essing.      */.
327b0 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d        iUseFlag =
327c0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
327d0 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61  .      iAbortFla
327e0 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  g = ++pParse->nM
327f0 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74  em;.      regOut
32800 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73  putRow = ++pPars
32810 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
32820 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73  ddrOutputRow = s
32830 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
32840 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65  bel(v);.      re
32850 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  gReset = ++pPars
32860 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61  e->nMem;.      a
32870 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74  ddrReset = sqlit
32880 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
32890 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20  v);.      iAMem 
328a0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
328b0 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
328c0 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
328d0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
328e0 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iBMem = pParse-
328f0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
32900 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
32910 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
32920 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
32930 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
32940 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f  Integer, 0, iAbo
32950 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  rtFlag);.      V
32960 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
32970 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67  clear abort flag
32980 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
32990 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
329a0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69  OP_Integer, 0, i
329b0 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  UseFlag);.      
329c0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
329d0 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75  "indicate accumu
329e0 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a  lator empty"));.
329f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
32a00 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
32a10 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41  ll, 0, iAMem, iA
32a20 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45  Mem+pGroupBy->nE
32a30 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f  xpr-1);..      /
32a40 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74  * Begin a loop t
32a50 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63 74  hat will extract
32a60 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77 73   all source rows
32a70 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64   in GROUP BY ord
32a80 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  er..      ** Thi
32a90 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65 20  s might involve 
32aa0 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f 6f  two separate loo
32ab0 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f  ps with an OP_So
32ac0 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f  rt in between, o
32ad0 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69  r.      ** it mi
32ae0 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ght be a single 
32af0 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20 61  loop that uses a
32b00 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72 61  n index to extra
32b10 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  ct information. 
32b20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72       ** in the r
32b30 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62 65  ight order to be
32b40 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20 20  gin with..      
32b50 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
32b60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
32b70 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
32b80 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
32b90 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
32ba0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
32bb0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
32bc0 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70 42   pWhere, pGroupB
32bd0 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  y, 0,.          
32be0 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c 20  WHERE_GROUPBY | 
32bf0 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57 48  (orderByGrp ? WH
32c00 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 20  ERE_SORTBYGROUP 
32c10 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29 3b  : 0), 0.      );
32c20 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66  .      if( pWInf
32c30 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
32c40 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69 66  ct_end;.      if
32c50 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  ( sqlite3WhereIs
32c60 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3d  Ordered(pWInfo)=
32c70 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
32c80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
32c90 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
32ca0 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
32cb0 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
32cc0 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
32cd0 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
32ce0 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
32cf0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
32d00 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
32d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
32d20 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
32d30 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
32d40 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
32d50 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
32d60 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
32d70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
32d80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
32d90 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
32da0 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
32db0 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
32dc0 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
32dd0 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
32de0 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
32df0 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
32e00 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
32e10 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
32e20 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
32e30 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
32e40 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
32e50 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
32e60 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
32e70 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
32e80 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
32e90 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
32ea0 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
32eb0 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
32ec0 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
32ed0 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
32ee0 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
32ef0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
32f00 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
32f10 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
32f20 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
32f30 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
32f40 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
32f50 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
32f60 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
32f70 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
32f80 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
32f90 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
32fa0 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
32fb0 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  = nGroupBy;.    
32fc0 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79      j = nGroupBy
32fd0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
32fe0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
32ff0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
33000 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
33010 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
33020 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
33030 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
33040 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
33050 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
33060 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33070 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
33080 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
33090 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
330a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
330b0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
330c0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
330d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
330e0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
330f0 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
33100 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
33110 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20   j = nGroupBy;. 
33120 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
33130 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
33140 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
33150 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
33160 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
33170 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
33180 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
33190 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
331a0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
331b0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
331c0 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
331d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
331e0 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
331f0 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a 20  ToReg(pParse, . 
33200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
33220 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
33230 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
33240 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20 20  Table, r1);.    
33250 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
33260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33270 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
33280 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
33290 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
332a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
332b0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
332c0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
332d0 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
332e0 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
332f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33300 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
33310 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
33320 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
33330 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
33340 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
33350 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
33360 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
33370 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
33380 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
33390 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
333a0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
333b0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
333c0 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
333d0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54  nfo.sortingIdxPT
333e0 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20  ab = sortPTab = 
333f0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
33400 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20          sortOut 
33410 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
33420 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
33430 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
33440 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
33450 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61  nPseudo, sortPTa
33460 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c  b, sortOut, nCol
33470 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
33480 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
33490 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73  OP_SorterSort, s
334a0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
334b0 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
334c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
334d0 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
334e0 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76  sort")); VdbeCov
334f0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
33500 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
33510 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
33520 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
33530 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
33540 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a 20  se);..      }.. 
33550 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69       /* If the i
33560 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61 72  ndex or temporar
33570 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20  y table used by 
33580 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f 72  the GROUP BY sor
33590 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  t.      ** will 
335a0 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76 65  naturally delive
335b0 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f 72  r rows in the or
335c0 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79 20  der required by 
335d0 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
335e0 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63 61     ** clause, ca
335f0 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65 72  ncel the ephemer
33600 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63 6f  al table open co
33610 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20 20  ded earlier..   
33620 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
33630 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
33640 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
33650 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
33660 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
33670 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55  less..      ** U
33680 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
33690 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
336a0 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
336b0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20 74  CTRL_OPTIMIZER t
336c0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61  o .      ** disa
336d0 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ble this optimiz
336e0 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e  ation for testin
336f0 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a  g purposes.  */.
33700 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72 42        if( orderB
33710 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a 61  yGrp && Optimiza
33720 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20  tionEnabled(db, 
33730 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
33740 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26 20  der) .       && 
33750 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c 20  (groupBySort || 
33760 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f  sqlite3WhereIsSo
33770 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20 20  rted(pWInfo)).  
33780 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
33790 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
337a0 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
337b0 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
337c0 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72  op(v, sSort.addr
337d0 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20  SortIndex);.    
337e0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76    }..      /* Ev
337f0 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65  aluate the curre
33800 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
33810 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62  s and store in b
33820 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20  0, b1, b2....   
33830 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d     ** (b0 is mem
33840 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d  ory location iBM
33850 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65  em+0, b1 is iBMe
33860 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  m+1, and so fort
33870 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  h).      ** Then
33880 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72   compare the cur
33890 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
338a0 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  rms against the 
338b0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20  GROUP BY terms. 
338c0 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
338d0 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75   previous row cu
338e0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
338f0 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a  n a0, a1, a2....
33900 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
33910 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73  ddrTopOfLoop = s
33920 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
33930 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
33940 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
33950 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
33960 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
33970 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
33980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
33990 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  3(v, OP_SorterDa
339a0 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72  ta, sAggInfo.sor
339b0 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20 20  tingIdx,.       
339c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339d0 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72 74     sortOut, sort
339e0 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  PTab);.      }. 
339f0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
33a00 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
33a10 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
33a20 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
33a30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
33a40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
33a50 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74   OP_Column, sort
33a60 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  PTab, j, iBMem+j
33a70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
33a80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
33a90 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
33aa0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
33ab0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
33ac0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
33ad0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
33ae0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
33af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
33b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
33b10 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
33b20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
33b30 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
33b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b50 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
33b60 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
33b70 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
33b80 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
33b90 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
33ba0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
33bb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33bc0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
33bd0 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c 20  _Jump, addr1+1, 
33be0 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62  0, addr1+1); Vdb
33bf0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
33c00 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
33c10 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
33c20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
33c30 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
33c40 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
33c50 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
33c60 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
33c70 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
33c80 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
33c90 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
33ca0 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
33cb0 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
33cc0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
33cd0 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
33ce0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
33cf0 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
33d00 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
33d10 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
33d20 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
33d30 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
33d40 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
33d50 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
33d60 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
33d70 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
33d80 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
33d90 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
33da0 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
33db0 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
33dc0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
33dd0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
33de0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
33df0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
33e00 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
33e10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
33e20 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
33e30 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
33e40 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
33e50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
33e60 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
33e70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
33e80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
33e90 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
33ea0 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56 64  ag, addrEnd); Vd
33eb0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
33ec0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
33ed0 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
33ee0 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
33ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
33f00 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
33f10 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
33f20 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
33f30 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
33f40 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
33f50 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
33f60 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
33f70 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
33f80 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
33f90 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
33fa0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
33fb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
33fc0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
33fd0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
33fe0 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d 75      updateAccumu
33ff0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
34000 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
34010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34020 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
34030 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   1, iUseFlag);. 
34040 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
34050 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 64  ((v, "indicate d
34060 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61 74  ata in accumulat
34070 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
34080 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   End of the loop
34090 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
340a0 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
340b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
340c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
340d0 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 73  OP_SorterNext, s
340e0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
340f0 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
34100 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  p);.        Vdbe
34110 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
34120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34130 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
34140 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
34150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
34160 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
34170 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20  drSortingIdx);. 
34180 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
34190 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61   Output the fina
341a0 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a  l row of result.
341b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
341c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
341d0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
341e0 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72  gOutputRow, addr
341f0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
34200 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
34210 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20  , "output final 
34220 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  row"));..      /
34230 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20  * Jump over the 
34240 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20  subroutines.    
34250 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
34260 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
34270 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f  drEnd);..      /
34280 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
34290 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
342a0 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  puts a single ro
342b0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
342c0 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20 54        ** set.  T
342d0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 66  his subroutine f
342e0 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68  irst looks at th
342f0 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66 20  e iUseFlag.  If 
34300 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20 2a  iUseFlag.      *
34310 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  * is less than o
34320 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
34330 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
34340 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a  is a no-op.  If.
34350 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f        ** the pro
34360 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f  cessing calls fo
34370 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 61  r the query to a
34380 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72 6f  bort, this subro
34390 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  utine.      ** i
343a0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69 41  ncrements the iA
343b0 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20  bortFlag memory 
343c0 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20  location before 
343d0 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20  returning in.   
343e0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73     ** order to s
343f0 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65 72  ignal the caller
34400 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20 20   to abort..     
34410 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53 65   */.      addrSe
34420 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65 33  tAbort = sqlite3
34430 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
34440 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
34450 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
34460 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 41  P_Integer, 1, iA
34470 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
34480 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
34490 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61 67   "set abort flag
344a0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
344b0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
344c0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
344d0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
344e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
344f0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4f  veLabel(v, addrO
34500 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
34510 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
34520 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
34530 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
34540 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
34550 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op2(v, OP_IfPos,
34560 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72 4f   iUseFlag, addrO
34570 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20  utputRow+2);.   
34580 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
34590 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  v);.      VdbeCo
345a0 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
345b0 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
345c0 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
345d0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
345e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
345f0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
34600 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
34610 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
34620 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
34630 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
34640 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
34650 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
34660 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
34670 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
34680 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
34690 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
346a0 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f  rse, p, -1, &sSo
346b0 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
346c0 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73 74            &sDist
346d0 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20  inct, pDest,.   
346e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346f0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
34700 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74  +1, addrSetAbort
34710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34720 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34730 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
34740 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64  utRow);.      Vd
34750 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
34760 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c  nd groupby resul
34770 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a  t generator"));.
34780 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
34790 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
347a0 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20  that will reset 
347b0 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63  the group-by acc
347c0 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a  umulator.      *
347d0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
347e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
347f0 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  v, addrReset);. 
34800 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
34810 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
34820 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
34830 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34840 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
34850 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20  regReset);.     
34860 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20  .    } /* endif 
34870 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e  pGroupBy.  Begin
34880 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69   aggregate queri
34890 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50  es without GROUP
348a0 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65   BY: */.    else
348b0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
348c0 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66  t *pDel = 0;.#if
348d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
348e0 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20  _BTREECOUNT.    
348f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
34900 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20 3d       if( (pTab =
34910 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70   isSimpleCount(p
34920 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30  , &sAggInfo))!=0
34930 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
34940 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  f isSimpleCount(
34950 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  ) returns a poin
34960 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73  ter to a Table s
34970 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20  tructure, then. 
34980 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51         ** the SQ
34990 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  L statement is o
349a0 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20  f the form:.    
349b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
349c0 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  *   SELECT count
349d0 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20  (*) FROM <tbl>. 
349e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
349f0 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54    ** where the T
34a00 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 72  able structure r
34a10 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e  eturned represen
34a20 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a  ts table <tbl>..
34a30 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
34a40 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65     ** This state
34a50 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f  ment is so commo
34a60 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70 74  n that it is opt
34a70 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79  imized specially
34a80 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
34a90 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75   OP_Count instru
34aa0 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65  ction is execute
34ab0 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20  d either on the 
34ac0 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61  intkey table tha
34ad0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
34ae0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20 66  tains the data f
34af0 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f  or table <tbl> o
34b00 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20  r on one of its 
34b10 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20  indexes. It.    
34b20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72      ** is better
34b30 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
34b40 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20  op on an index, 
34b50 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20 61  as indexes are a
34b60 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  lmost.        **
34b70 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20 61   always spread a
34b80 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73  cross less pages
34b90 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72   than their corr
34ba0 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73  esponding tables
34bb0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34bc0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
34bd0 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
34be0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
34bf0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
34c00 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ema);.        co
34c10 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70  nst int iCsr = p
34c20 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
34c30 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
34c40 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20  scan b-tree */. 
34c50 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49         Index *pI
34c60 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
34c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
34c80 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
34c90 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49   */.        KeyI
34ca0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
34cb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
34cc0 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20   /* Keyinfo for 
34cd0 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f  scanned index */
34ce0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
34cf0 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
34d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34d10 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e   Best index foun
34d20 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  d so far */.    
34d30 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20      int iRoot = 
34d40 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20  pTab->tnum;     
34d50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
34d60 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64   page of scanned
34d70 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20   b-tree */..    
34d80 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
34d90 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
34da0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
34db0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
34dc0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
34dd0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
34de0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
34df0 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
34e00 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74 68  for the index th
34e10 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65 73  at has the lowes
34e20 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20  t scan cost..   
34e30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
34e40 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29 20  ** (2011-04-15) 
34e50 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c  Do not do a full
34e60 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72   scan of an unor
34e70 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20 20  dered index..   
34e80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
34e90 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29 20  ** (2013-10-03) 
34ea0 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65  Do not count the
34eb0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70 61   entries in a pa
34ec0 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20  rtial index..   
34ed0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
34ee0 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20 74  ** In practice t
34ef0 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
34f00 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ture will not be
34f10 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c   used. It is onl
34f20 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  y .        ** pa
34f30 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f  ssed to keep OP_
34f40 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e 0a  OpenRead happy..
34f50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34f60 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64     if( !HasRowid
34f70 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20 3d  (pTab) ) pBest =
34f80 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
34f90 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
34fa0 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
34fb0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
34fc0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
34fd0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
34fe0 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
34ff0 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  dered==0.       
35000 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a 49      && pIdx->szI
35010 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61  dxRow<pTab->szTa
35020 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20 20  bRow.           
35030 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64  && pIdx->pPartId
35040 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20 20  xWhere==0.      
35050 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74 20       && (!pBest 
35060 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  || pIdx->szIdxRo
35070 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f  w<pBest->szIdxRo
35080 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  w).          ){.
35090 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65 73              pBes
350a0 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20  t = pIdx;.      
350b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
350c0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65 73          if( pBes
350d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
350e0 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e  Root = pBest->tn
350f0 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4b  um;.          pK
35100 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
35110 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
35120 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a 20  Parse, pBest);. 
35130 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
35140 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61 64    /* Open a read
35150 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65 78  -only cursor, ex
35160 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f 75  ecute the OP_Cou
35170 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63 75  nt, close the cu
35180 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rsor. */.       
35190 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
351a0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e  p4Int(v, OP_Open
351b0 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
351c0 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20 20  t, iDb, 1);.    
351d0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
351e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
351f0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
35200 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
35210 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
35220 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
35230 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
35240 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
35250 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73  P_Count, iCsr, s
35260 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
35270 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
35280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35290 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
352a0 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65 78  Csr);.        ex
352b0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
352c0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
352d0 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Best);.      }el
352e0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
352f0 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f  ITE_OMIT_BTREECO
35300 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  UNT */.      {. 
35310 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
35320 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  if the query is 
35330 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  of one of the fo
35340 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20  llowing forms:. 
35350 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
35360 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 69    **   SELECT mi
35370 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  n(x) FROM ....  
35380 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
35390 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e  T max(x) FROM ..
353a0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
353b0 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
353c0 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
353d0 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
353e0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
353f0 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
35400 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65    ** as if there
35410 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f   was an "ORDER O
35420 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f  N x" or "ORDER O
35430 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73 65  N x DESC" clause
35440 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66  . .        ** If
35450 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
35460 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
35470 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
35480 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
35490 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64         ** add vd
354a0 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b  be code to break
354b0 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63   out of the proc
354c0 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65  essing loop afte
354d0 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  r the .        *
354e0 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  * first iteratio
354f0 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69 72  n (since the fir
35500 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
35510 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20  the loop is .   
35520 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
35530 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ed to operate on
35540 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74 68   the row with th
35550 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78  e minimum or max
35560 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a  imum .        **
35570 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68 65   value of x, the
35580 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69 72   only row requir
35590 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ed)..        **.
355a0 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65          ** A spe
355b0 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
355c0 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
355d0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
355e0 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
355f0 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65      ** modify be
35600 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77  havior as follow
35610 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  s:.        **.  
35620 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20        **   + If 
35630 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22  the query is a "
35640 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20  SELECT min(x)", 
35650 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f  then the loop co
35660 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 2a  ded by.        *
35670 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73 68  *     where.c sh
35680 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74 65  ould not iterate
35690 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65 73   over any values
356a0 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c   with a NULL val
356b0 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ue.        **   
356c0 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20 20    for x..       
356d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
356e0 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72   + The optimizer
356f0 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
35700 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61 74   (the thing that
35710 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a 20   decides which. 
35720 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69 6e         **     in
35730 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20 74  dex or indices t
35740 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70 6c  o use) should pl
35750 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74 20  ace a different 
35760 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20  priority on .   
35770 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69       **     sati
35780 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45  sfying the 'ORDE
35790 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61  R BY' clause tha
357a0 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68  n it does in oth
357b0 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20  er cases..      
357c0 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20 74    **     Refer t
357d0 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65  o code and comme
357e0 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20 66  nts in where.c f
357f0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  or details..    
35800 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 45      */.        E
35810 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78  xprList *pMinMax
35820 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
35830 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52   flag = WHERE_OR
35840 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
35850 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 61        .        a
35860 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70  ssert( p->pGroup
35870 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
35880 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30   assert( flag==0
35890 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
358a0 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b  p->pHaving==0 ){
358b0 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  .          flag 
358c0 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26 73  = minMaxQuery(&s
358d0 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61  AggInfo, &pMinMa
358e0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
358f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
35900 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61  ag==0 || (pMinMa
35910 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d  x!=0 && pMinMax-
35920 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20  >nExpr==1) );.. 
35930 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20         if( flag 
35940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 69  ){.          pMi
35950 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78  nMax = sqlite3Ex
35960 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4d  prListDup(db, pM
35970 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20 20  inMax, 0);.     
35980 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
35990 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20 61  Max;.          a
359a0 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
359b0 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d  cFailed || pMinM
359c0 61 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ax!=0 );.       
359d0 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
359e0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
359f0 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d          pMinMax-
35a00 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
35a10 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52  = flag!=WHERE_OR
35a20 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a  DERBY_MIN ?1:0;.
35a30 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
35a40 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  Max->a[0].pExpr-
35a50 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
35a60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35a70 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
35a80 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72    /* This case r
35a90 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65  uns if the aggre
35aa0 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55  gate has no GROU
35ab0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68  P BY clause.  Th
35ac0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
35ad0 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20  cessing is much 
35ae0 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68  simpler since th
35af0 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69  ere is only a si
35b00 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20  ngle row.       
35b10 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20   ** of output.. 
35b20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35b30 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
35b40 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
35b50 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Info);.        p
35b60 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
35b70 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
35b80 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
35b90 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 2c 66  re, pMinMax, 0,f
35ba0 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  lag,0);.        
35bb0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
35bc0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
35bd0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
35be0 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
35bf0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
35c00 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
35c10 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41  .        updateA
35c20 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
35c30 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
35c40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
35c50 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69  MinMax==0 || pMi
35c60 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  nMax->nExpr==1 )
35c70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
35c80 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
35c90 72 65 64 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b  red(pWInfo)>0 ){
35ca0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
35cb0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 73 71  e3VdbeGoto(v, sq
35cc0 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
35cd0 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20  abel(pWInfo));. 
35ce0 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d           VdbeCom
35cf0 6d 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62  ment((v, "%s() b
35d00 79 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20  y index",.      
35d10 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d            (flag=
35d20 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
35d30 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29  IN?"min":"max"))
35d40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35d50 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
35d60 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
35d70 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67        finalizeAg
35d80 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73  gFunctions(pPars
35d90 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
35da0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 53       }..      sS
35db0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ort.pOrderBy = 0
35dc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
35dd0 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
35de0 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
35df0 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  End, SQLITE_JUMP
35e00 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
35e10 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
35e20 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c  Parse, p, -1, 0,
35e30 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
35e40 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
35e50 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45  , addrEnd, addrE
35e60 6e 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nd);.      sqlit
35e70 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
35e80 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
35e90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
35ea0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
35eb0 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a   addrEnd);.    .
35ec0 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67    } /* endif agg
35ed0 72 65 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a  regate query */.
35ee0 0a 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74  .  if( sDistinct
35ef0 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52  .eTnctType==WHER
35f00 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
35f10 45 52 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c  ERED ){.    expl
35f20 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
35f30 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29  rse, "DISTINCT")
35f40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
35f50 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
35f60 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
35f70 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
35f80 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
35f90 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
35fa0 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
35fb0 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
35fc0 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
35fd0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70  derBy ){.    exp
35fe0 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
35ff0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
36000 20 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74             sSort
36010 2e 6e 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47  .nOBSat>0 ? "RIG
36020 48 54 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52  HT PART OF ORDER
36030 20 42 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29   BY":"ORDER BY")
36040 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f  ;.    generateSo
36050 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70  rtTail(pParse, p
36060 2c 20 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74  , &sSort, pEList
36070 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
36080 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
36090 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
360a0 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
360b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
360c0 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
360d0 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
360e0 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
360f0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
36100 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61   error in the Pa
36110 72 73 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20  rse structure,. 
36120 20 2a 2a 20 73 65 74 20 74 68 65 20 72 65 74 75   ** set the retu
36130 72 6e 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74  rn code to 1. Ot
36140 68 65 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20  herwise 0. */.  
36150 72 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45  rc = (pParse->nE
36160 72 72 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  rr>0);..  /* Con
36170 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65  trol jumps to he
36180 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  re if an error i
36190 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62  s encountered ab
361a0 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a  ove, or upon.  *
361b0 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64  * successful cod
361c0 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ing of the SELEC
361d0 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65  T..  */.select_e
361e0 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  nd:.  explainSet
361f0 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
36200 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
36210 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20  oreSelectId);.. 
36220 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
36230 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  b, sAggInfo.aCol
36240 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
36250 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
36260 61 46 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45  aFunc);.#if SELE
36270 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
36280 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c    SELECTTRACE(1,
36290 70 50 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70  pParse,p,("end p
362a0 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a  rocessing\n"));.
362b0 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63    pParse->nSelec
362c0 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69  tIndent--;.#endi
362d0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
362e0 0a                                               .