/ Hex Artifact Content
Login

Artifact afcf31d8ed7c890328a31d3f350467ccd273af345b24562382b398d6d9cd0664:


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 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
0f40: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
0f50: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
0f60: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
0f70: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
0f80: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
0f90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
0fa0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
0fb0: 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73 74 61  .    pNew = &sta
0fc0: 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndin;.  }.  if( 
0fd0: 70 45 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  pEList==0 ){.   
0fe0: 20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   pEList = sqlite
0ff0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1000: 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
1010: 65 33 45 78 70 72 28 64 62 2c 54 4b 5f 41 53 54  e3Expr(db,TK_AST
1020: 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20  ERISK,0));.  }. 
1030: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
1040: 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d 3e  pEList;.  pNew->
1050: 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a  op = TK_SELECT;.
1060: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
1070: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
1080: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b  New->iLimit = 0;
1090: 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74  .  pNew->iOffset
10a0: 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43 54   = 0;.#if SELECT
10b0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
10c0: 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30  pNew->zSelName[0
10d0: 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  ] = 0;.#endif.  
10e0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
10f0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
1100: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
1110: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
1120: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30  ->nSelectRow = 0
1130: 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
1140: 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ) pSrc = sqlite3
1150: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1160: 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b   sizeof(*pSrc));
1170: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
1180: 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  pSrc;.  pNew->pW
1190: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
11a0: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
11b0: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e  = pGroupBy;.  pN
11c0: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48  ew->pHaving = pH
11d0: 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70  aving;.  pNew->p
11e0: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
11f0: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  By;.  pNew->pPri
1200: 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  or = 0;.  pNew->
1210: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
1220: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  w->pLimit = pLim
1230: 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66  it;.  pNew->pOff
1240: 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
1250: 20 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30   pNew->pWith = 0
1260: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 66 66  ;.  assert( pOff
1270: 73 65 74 3d 3d 30 20 7c 7c 20 70 4c 69 6d 69 74  set==0 || pLimit
1280: 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  !=0 || pParse->n
1290: 45 72 72 3e 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Err>0 || db->mal
12a0: 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29 3b 0a  locFailed!=0 );.
12b0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12c0: 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20 20 63  Failed ) {.    c
12d0: 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70  learSelect(db, p
12e0: 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e  New, pNew!=&stan
12f0: 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  din);.    pNew =
1300: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1310: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
1320: 53 72 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  Src!=0 || pParse
1330: 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a  ->nErr>0 );.  }.
1340: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
1350: 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65  &standin );.  re
1360: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69  turn pNew;.}..#i
1370: 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
1380: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ABLED./*.** Set 
1390: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65  the name of a Se
13a0: 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  lect object.*/.v
13b0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
13c0: 74 53 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20  tSetName(Select 
13d0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
13e0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20  zName){.  if( p 
13f0: 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  && zName ){.    
1400: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1410: 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e  (sizeof(p->zSelN
1420: 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d  ame), p->zSelNam
1430: 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  e, "%s", zName);
1440: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
1450: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
1460: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
1470: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
1480: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
1490: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
14a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
14b0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
14c0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
14d0: 20 70 20 29 20 63 6c 65 61 72 53 65 6c 65 63 74   p ) clearSelect
14e0: 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f  (db, p, 1);.}../
14f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1500: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
1510: 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
1520: 74 61 74 65 6d 65 6e 74 20 69 6e 20 61 20 63 6f  tatement in a co
1530: 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  mpound..*/.stati
1540: 63 20 53 65 6c 65 63 74 20 2a 66 69 6e 64 52 69  c Select *findRi
1550: 67 68 74 6d 6f 73 74 28 53 65 6c 65 63 74 20 2a  ghtmost(Select *
1560: 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  p){.  while( p->
1570: 70 4e 65 78 74 20 29 20 70 20 3d 20 70 2d 3e 70  pNext ) p = p->p
1580: 4e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70  Next;.  return p
1590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
15a0: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
15b0: 65 72 73 20 70 72 65 63 65 64 69 6e 67 20 74 68  ers preceding th
15c0: 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c 20  e JOIN keyword, 
15d0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a 2a  determine the.**
15e0: 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20 20   type of join.  
15f0: 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
1600: 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  r constant that 
1610: 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20 74  expresses that t
1620: 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73 20  ype.** in terms 
1630: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1640: 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a   bit values:.**.
1650: 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52 0a  **     JT_INNER.
1660: 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53 0a  **     JT_CROSS.
1670: 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52 0a  **     JT_OUTER.
1680: 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52 41  **     JT_NATURA
1690: 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46 54  L.**     JT_LEFT
16a0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48 54  .**     JT_RIGHT
16b0: 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f 75  .**.** A full ou
16c0: 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65 20  ter join is the 
16d0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 4a  combination of J
16e0: 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52 49  T_LEFT and JT_RI
16f0: 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  GHT..**.** If an
1700: 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73 75   illegal or unsu
1710: 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70  pported join typ
1720: 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20  e is seen, then 
1730: 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a 20  still return.** 
1740: 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75 74  a join type, but
1750: 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69 6e   put an error in
1760: 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1770: 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
1780: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50 61  lite3JoinType(Pa
1790: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
17a0: 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a 70  en *pA, Token *p
17b0: 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20  B, Token *pC){. 
17c0: 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d 20   int jointype = 
17d0: 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41 6c  0;.  Token *apAl
17e0: 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  l[3];.  Token *p
17f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1810: 2a 20 20 20 30 31 32 33 34 35 36 37 38 39 20 31  *   0123456789 1
1820: 32 33 34 35 36 37 38 39 20 31 32 33 34 35 36 37  23456789 1234567
1830: 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74 61 74  89 123 */.  stat
1840: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 4b  ic const char zK
1850: 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61 74 75  eyText[] = "natu
1860: 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68 74 66  raleftouterightf
1870: 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22 3b 0a  ullinnercross";.
1880: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
1890: 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38 20 69  truct {.    u8 i
18a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
18b0: 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f 72 64  nning of keyword
18c0: 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54 65 78   text in zKeyTex
18d0: 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 6e 43  t[] */.    u8 nC
18e0: 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e 67 74  har;    /* Lengt
18f0: 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f 72 64  h of the keyword
1900: 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 20 2a   in characters *
1910: 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b 20 20  /.    u8 code;  
1920: 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70 65 20     /* Join type 
1930: 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b 65 79  mask */.  } aKey
1940: 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  word[] = {.    /
1950: 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b 20 30  * natural */ { 0
1960: 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52 41 4c  ,  7, JT_NATURAL
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74 20 20  },.    /* left  
1990: 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20 4a 54    */ { 6,  4, JT
19a0: 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 20 20  _LEFT|JT_OUTER  
19b0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
19c0: 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b 20 31  * outer   */ { 1
19d0: 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52 20 20  0, 5, JT_OUTER  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68 74 20  },.    /* right 
1a00: 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20 4a 54    */ { 14, 5, JT
1a10: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
1a20: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1a30: 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b 20 31  * full    */ { 1
1a40: 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  9, 4, JT_LEFT|JT
1a50: 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45 52 20  _RIGHT|JT_OUTER 
1a60: 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65 72 20  },.    /* inner 
1a70: 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20 4a 54    */ { 23, 5, JT
1a80: 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20 20 20  _INNER          
1a90: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1aa0: 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b 20 32  * cross   */ { 2
1ab0: 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a  8, 5, JT_INNER|J
1ac0: 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20 20 20  T_CROSS         
1ad0: 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
1ae0: 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d   j;.  apAll[0] =
1af0: 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20   pA;.  apAll[1] 
1b00: 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d  = pB;.  apAll[2]
1b10: 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30   = pC;.  for(i=0
1b20: 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69  ; i<3 && apAll[i
1b30: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  ]; i++){.    p =
1b40: 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66   apAll[i];.    f
1b50: 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53  or(j=0; j<ArrayS
1b60: 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b 20 6a  ize(aKeyword); j
1b70: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1b80: 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d  ->n==aKeyword[j]
1b90: 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20  .nChar .        
1ba0: 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
1bb0: 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a  ICmp((char*)p->z
1bc0: 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b 65 79  , &zKeyText[aKey
1bd0: 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e  word[j].i], p->n
1be0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1bf0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b 65 79  jointype |= aKey
1c00: 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20  word[j].code;.  
1c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74     }.    }.    t
1c30: 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20 7c 7c  estcase( j==0 ||
1c40: 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c   j==1 || j==2 ||
1c50: 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c   j==3 || j==4 ||
1c60: 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b   j==5 || j==6 );
1c70: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72 72 61  .    if( j>=Arra
1c80: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 20  ySize(aKeyword) 
1c90: 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  ){.      jointyp
1ca0: 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b 0a 20  e |= JT_ERROR;. 
1cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cc0: 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20 20 20  }.  }.  if(.    
1cd0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
1ce0: 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29  _INNER|JT_OUTER)
1cf0: 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f  )==(JT_INNER|JT_
1d00: 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20 20 28  OUTER) ||.     (
1d10: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 45 52  jointype & JT_ER
1d20: 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ROR)!=0.  ){.   
1d30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70   const char *zSp
1d40: 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73 73 65   = " ";.    asse
1d50: 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20 20 20  rt( pB!=0 );.   
1d60: 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20 7a 53   if( pC==0 ){ zS
1d70: 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c 69 74  p++; }.    sqlit
1d80: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1d90: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75  e, "unknown or u
1da0: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
1db0: 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20 20 22  type: ".       "
1dc0: 25 54 20 25 54 25 73 25 54 22 2c 20 70 41 2c 20  %T %T%s%T", pA, 
1dd0: 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a 20 20  pB, zSp, pC);.  
1de0: 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f    jointype = JT_
1df0: 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65 20 69  INNER;.  }else i
1e00: 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a  f( (jointype & J
1e10: 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20 20 20  T_OUTER)!=0 .   
1e20: 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e 74 79        && (jointy
1e30: 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1e40: 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c 45 46  _RIGHT))!=JT_LEF
1e50: 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
1e60: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1e70: 20 0a 20 20 20 20 20 20 22 52 49 47 48 54 20 61   .      "RIGHT a
1e80: 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20 4a 4f  nd FULL OUTER JO
1e90: 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75 72 72  INs are not curr
1ea0: 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65 64 22  ently supported"
1eb0: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
1ec0: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a  = JT_INNER;.  }.
1ed0: 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74 79 70    return jointyp
1ee0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1ef0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
1f00: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 74 61  a column in a ta
1f10: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ble.  Return -1 
1f20: 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a  if the column.**
1f30: 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   is not containe
1f40: 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  d in the table..
1f50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1f60: 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c 65 20  lumnIndex(Table 
1f70: 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63 68 61  *pTab, const cha
1f80: 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  r *zCol){.  int 
1f90: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1fa0: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  pTab->nCol; i++)
1fb0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1fc0: 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  3StrICmp(pTab->a
1fd0: 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43  Col[i].zName, zC
1fe0: 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ol)==0 ) return 
1ff0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
2000: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  -1;.}../*.** Sea
2010: 72 63 68 20 74 68 65 20 66 69 72 73 74 20 4e 20  rch the first N 
2020: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 2c 20  tables in pSrc, 
2030: 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
2040: 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ht, looking for 
2050: 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20  a.** table that 
2060: 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d  has a column nam
2070: 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a  ed zCol.  .**.**
2080: 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73 65 74   When found, set
2090: 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70 69 43   *piTab and *piC
20a0: 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ol to the table 
20b0: 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75 6d 6e  index and column
20c0: 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74 68 65   index.** of the
20d0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
20e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52 55 45   and return TRUE
20f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74 20 66  ..**.** If not f
2100: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46 41 4c  ound, return FAL
2110: 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  SE..*/.static in
2120: 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  t tableAndColumn
2130: 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69 73 74  Index(.  SrcList
2140: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 2f 2a   *pSrc,       /*
2150: 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c 65 73   Array of tables
2160: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
2170: 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20  int N,          
2180: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2190: 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  f tables in pSrc
21a0: 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63 68 20  ->a[] to search 
21b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
21c0: 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zCol,    /* Nam
21d0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
21e0: 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66  we are looking f
21f0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 54  or */.  int *piT
2200: 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ab,          /* 
2210: 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70  Write index of p
2220: 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20 2a 2f  Src->a[] here */
2230: 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20 20 20  .  int *piCol   
2240: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2250: 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d 3e   index of pSrc->
2260: 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62 2d 3e  a[*piTab].pTab->
2270: 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f 0a 29  aCol[] here */.)
2280: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2290: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
22a0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62  looping over tab
22b0: 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  les in pSrc */. 
22c0: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
22d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
22e0: 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68 69 6e  f column matchin
22f0: 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73  g zCol */..  ass
2300: 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30 29 3d  ert( (piTab==0)=
2310: 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b 20 20  =(piCol==0) );  
2320: 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69 74 68  /* Both or neith
2330: 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20  er are NULL */. 
2340: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
2350: 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ++){.    iCol = 
2360: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72 63  columnIndex(pSrc
2370: 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a 43 6f  ->a[i].pTab, zCo
2380: 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  l);.    if( iCol
2390: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
23a0: 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20   piTab ){.      
23b0: 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a 20 20    *piTab = i;.  
23c0: 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69        *piCol = i
23d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Col;.      }.   
23e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
23f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2400: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
2410: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2420: 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73 20 69  d to add terms i
2430: 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e 20 73  mplied by JOIN s
2440: 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a 2a 20  yntax to the.** 
2450: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
2460: 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53 45 4c  ression of a SEL
2470: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
2480: 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77 68 69  he new term, whi
2490: 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64 20 77  ch.** is ANDed w
24a0: 69 74 68 20 74 68 65 20 65 78 69 73 74 69 6e 67  ith the existing
24b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69   WHERE clause, i
24c0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  s of the form:.*
24d0: 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e 63 6f  *.**    (tab1.co
24e0: 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32 29 0a  l1 = tab2.col2).
24f0: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 31  **.** where tab1
2500: 20 69 73 20 74 68 65 20 69 53 72 63 27 74 68 20   is the iSrc'th 
2510: 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69 73 74  table in SrcList
2520: 20 70 53 72 63 20 61 6e 64 20 74 61 62 32 20 69   pSrc and tab2 i
2530: 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72 63 2b  s the .** (iSrc+
2540: 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f  1)'th. Column co
2550: 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69 43 6f  l1 is column iCo
2560: 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c 20 61  lLeft of tab1, a
2570: 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f  nd col2 is.** co
2580: 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74 20 6f  lumn iColRight o
2590: 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61 74 69  f tab2..*/.stati
25a0: 63 20 76 6f 69 64 20 61 64 64 57 68 65 72 65 54  c void addWhereT
25b0: 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
25c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
25d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
25e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
25f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2610: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
2620: 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   in FROM clause 
2630: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74 2c 20  */.  int iLeft, 
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2660: 20 66 69 72 73 74 20 74 61 62 6c 65 20 74 6f 20   first table to 
2670: 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a 2f 0a  join in pSrc */.
2680: 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74 2c 20    int iColLeft, 
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
26b0: 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20 74 61  lumn in first ta
26c0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69  ble */.  int iRi
26d0: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
26e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
26f0: 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61 62 6c  x of second tabl
2700: 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69  e in pSrc */.  i
2710: 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20 20 20  nt iColRight,   
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2730: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
2740: 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61 62 6c  n in second tabl
2750: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f 75 74  e */.  int isOut
2760: 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20 20 20  erJoin,         
2770: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2780: 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f 55 54  f this is an OUT
2790: 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45 78 70  ER join */.  Exp
27a0: 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20 20 20  r **ppWhere     
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27c0: 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48 45 52  IN/OUT: The WHER
27d0: 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64 64 20  E clause to add 
27e0: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  to */.){.  sqlit
27f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2800: 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 31  >db;.  Expr *pE1
2810: 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b 0a 20  ;.  Expr *pE2;. 
2820: 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20 20 61   Expr *pEq;..  a
2830: 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69 52 69  ssert( iLeft<iRi
2840: 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ght );.  assert(
2850: 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52 69 67   pSrc->nSrc>iRig
2860: 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ht );.  assert( 
2870: 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70  pSrc->a[iLeft].p
2880: 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Tab );.  assert(
2890: 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68 74 5d   pSrc->a[iRight]
28a0: 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45 31 20  .pTab );..  pE1 
28b0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43  = sqlite3CreateC
28c0: 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53  olumnExpr(db, pS
28d0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f 6c 4c  rc, iLeft, iColL
28e0: 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20 73 71  eft);.  pE2 = sq
28f0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
2900: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
2910: 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69 67 68  iRight, iColRigh
2920: 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73 71 6c  t);..  pEq = sql
2930: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
2940: 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20 70 45  , TK_EQ, pE1, pE
2950: 32 29 3b 0a 20 20 69 66 28 20 70 45 71 20 26 26  2);.  if( pEq &&
2960: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20 29 7b 0a   isOuterJoin ){.
2970: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2980: 72 74 79 28 70 45 71 2c 20 45 50 5f 46 72 6f 6d  rty(pEq, EP_From
2990: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
29a0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
29b0: 72 74 79 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65  rty(pEq, EP_Toke
29c0: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
29d0: 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74  ) );.    ExprSet
29e0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 71 2c  VVAProperty(pEq,
29f0: 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20   EP_NoReduce);. 
2a00: 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f     pEq->iRightJo
2a10: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70  inTable = (i16)p
2a20: 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a  E2->iTable;.  }.
2a30: 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c    *ppWhere = sql
2a40: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2a50: 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a  *ppWhere, pEq);.
2a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2a70: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
2a80: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
2a90: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
2aa0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
2ab0: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
2ac0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2ad0: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
2ae0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
2af0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
2b00: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
2b10: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
2b20: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
2b30: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2b40: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
2b50: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
2b60: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
2b70: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
2b80: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
2b90: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
2ba0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
2bb0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
2bc0: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
2bd0: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
2be0: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
2bf0: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
2c00: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
2c10: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
2c20: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
2c30: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
2c40: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
2c50: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
2c60: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
2c70: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
2c80: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
2c90: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
2ca0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
2cb0: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
2cc0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
2cd0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
2ce0: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
2cf0: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
2d00: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
2d10: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
2d20: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
2d30: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2d40: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
2d50: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
2d60: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
2d70: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
2d80: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2d90: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
2da0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
2db0: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
2dc0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
2dd0: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
2de0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
2df0: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
2e00: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
2e10: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
2e20: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2e30: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2e40: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2e50: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
2e60: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
2e70: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
2e80: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2e90: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
2ea0: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
2eb0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
2ec0: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
2ed0: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
2ee0: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
2ef0: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
2f00: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
2f10: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
2f20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2f30: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2f40: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2f50: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
2f60: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2f70: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
2f80: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
2f90: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2fa0: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
2fb0: 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
2fc0: 29 3b 0a 20 20 20 20 45 78 70 72 53 65 74 56 56  );.    ExprSetVV
2fd0: 41 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  AProperty(p, EP_
2fe0: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2ff0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
3000: 65 20 3d 20 28 69 31 36 29 69 54 61 62 6c 65 3b  e = (i16)iTable;
3010: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
3020: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 70  TK_FUNCTION && p
3030: 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ->x.pList ){.   
3040: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
3050: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e  for(i=0; i<p->x.
3060: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3070: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 4a  +){.        setJ
3080: 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69  oinExpr(p->x.pLi
3090: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
30a0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d  iTable);.      }
30b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 4a 6f  .    }.    setJo
30c0: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
30d0: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
30e0: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
30f0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
3100: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
3110: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
3120: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
3130: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
3140: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
3150: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
3160: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
3170: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
3180: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
3190: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
31a0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
31b0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
31c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
31d0: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
31e0: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
31f0: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
3200: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
3210: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
3220: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
3230: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
3240: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
3250: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
3260: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
3270: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
3280: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
3290: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
32a0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
32b0: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
32c0: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
32d0: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
32e0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
32f0: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
3300: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
3310: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
3320: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
3330: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
3340: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
3350: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
3360: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
3370: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
3380: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
3390: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
33a0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
33b0: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
33c0: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
33d0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
33e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33f0: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
3400: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
3410: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
3420: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
3430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3440: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
3450: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3460: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
3470: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
3480: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
3490: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
34a0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
34b0: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
34c0: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
34d0: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
34e0: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
34f0: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
3500: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
3510: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
3520: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
3530: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
3540: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
3550: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
3560: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
3570: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
3580: 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e  ht->pTab;.    in
3590: 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20  t isOuter;..    
35a0: 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54  if( NEVER(pLeftT
35b0: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
35c0: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
35d0: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
35e0: 20 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69   (pRight->fg.joi
35f0: 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52  ntype & JT_OUTER
3600: 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  )!=0;..    /* Wh
3610: 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b  en the NATURAL k
3620: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
3630: 74 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61  t, add WHERE cla
3640: 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20  use terms for.  
3650: 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d    ** every colum
3660: 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74  n that the two t
3670: 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f  ables have in co
3680: 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mmon..    */.   
3690: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e   if( pRight->fg.
36a0: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
36b0: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  TURAL ){.      i
36c0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c  f( pRight->pOn |
36d0: 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  | pRight->pUsing
36e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3700: 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a  se, "a NATURAL j
3710: 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  oin may not have
3720: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
3730: 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c  n ON or USING cl
3740: 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  ause", 0);.     
3750: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3760: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
3770: 3d 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d  =0; j<pRightTab-
3780: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
3790: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
37a0: 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63  ;   /* Name of c
37b0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67  olumn in the rig
37c0: 68 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ht table */.    
37d0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
37e0: 20 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c     /* Matching l
37f0: 65 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eft table */.   
3800: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f       int iLeftCo
3810: 6c 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20  l;  /* Matching 
3820: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65  column in the le
3830: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  ft table */..   
3840: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69       zName = pRi
3850: 67 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ghtTab->aCol[j].
3860: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3870: 66 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  f( tableAndColum
3880: 6e 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31  nIndex(pSrc, i+1
3890: 2c 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c  , zName, &iLeft,
38a0: 20 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20   &iLeftCol) ){. 
38b0: 20 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72           addWher
38c0: 65 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53  eTerm(pParse, pS
38d0: 72 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74  rc, iLeft, iLeft
38e0: 43 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20  Col, i+1, j,.   
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
3910: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
3920: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3930: 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c  }..    /* Disall
3940: 6f 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ow both ON and U
3950: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20  SING clauses in 
3960: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20  the same join.  
3970: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3980: 67 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67  ght->pOn && pRig
3990: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
39a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
39b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
39c0: 6e 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e  not have both ON
39d0: 20 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20   and USING ".   
39e0: 20 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e       "clauses in
39f0: 20 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29   the same join")
3a00: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
3a10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3a20: 41 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  Add the ON claus
3a30: 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
3a40: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3a50: 2c 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20  , connected by. 
3a60: 20 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65     ** an AND ope
3a70: 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  rator..    */.  
3a80: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
3a90: 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  n ){.      if( i
3aa0: 73 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e  sOuter ) setJoin
3ab0: 45 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e  Expr(pRight->pOn
3ac0: 2c 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f  , pRight->iCurso
3ad0: 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68  r);.      p->pWh
3ae0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
3af0: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
3b00: 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67   p->pWhere, pRig
3b10: 68 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20  ht->pOn);.      
3b20: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b  pRight->pOn = 0;
3b30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
3b40: 72 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d  reate extra term
3b50: 73 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63  s on the WHERE c
3b60: 6c 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63  lause for each c
3b70: 6f 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20  olumn named.    
3b80: 2a 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ** in the USING 
3b90: 63 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65  clause.  Example
3ba0: 3a 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62  : If the two tab
3bb0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
3bc0: 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61   are .    ** A a
3bd0: 6e 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49  nd B and the USI
3be0: 4e 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20  NG clause names 
3bf0: 58 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65  X, Y, and Z, the
3c00: 6e 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a  n add this.    *
3c10: 2a 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  * to the WHERE c
3c20: 6c 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e  lause:    A.X=B.
3c30: 58 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e  X AND A.Y=B.Y AN
3c40: 44 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a  D A.Z=B.Z.    **
3c50: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
3c60: 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d   if any column m
3c70: 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20  entioned in the 
3c80: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a  USING clause is.
3c90: 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61      ** not conta
3ca0: 69 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62  ined in both tab
3cb0: 6c 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64  les to be joined
3cc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3cd0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
3ce0: 29 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20  ){.      IdList 
3cf0: 2a 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d  *pList = pRight-
3d00: 3e 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66  >pUsing;.      f
3d10: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d  or(j=0; j<pList-
3d20: 3e 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nId; j++){.    
3d30: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
3d40: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3d50: 74 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  the term in the 
3d60: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a  USING clause */.
3d70: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66          int iLef
3d80: 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c  t;       /* Tabl
3d90: 65 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69  e on the left wi
3da0: 74 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  th matching colu
3db0: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
3dc0: 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b     int iLeftCol;
3dd0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3de0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
3df0: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c   column on the l
3e00: 65 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  eft */.        i
3e10: 6e 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20  nt iRightCol;   
3e20: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e30: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e40: 75 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74  umn on the right
3e50: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61   */..        zNa
3e60: 6d 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d  me = pList->a[j]
3e70: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3e80: 69 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75  iRightCol = colu
3e90: 6d 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61  mnIndex(pRightTa
3ea0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
3eb0: 20 20 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c     if( iRightCol
3ec0: 3c 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21  <0.         || !
3ed0: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
3ee0: 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a  dex(pSrc, i+1, z
3ef0: 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69  Name, &iLeft, &i
3f00: 4c 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20  LeftCol).       
3f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
3f20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3f30: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f  arse, "cannot jo
3f40: 69 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20  in using column 
3f50: 25 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20  %s - column ".  
3f60: 20 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70            "not p
3f70: 72 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74  resent in both t
3f80: 61 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ables", zName);.
3f90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
3fa0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
3fb0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
3fc0: 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  rm(pParse, pSrc,
3fd0: 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c   iLeft, iLeftCol
3fe0: 2c 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c  , i+1, iRightCol
3ff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4000: 20 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20         isOuter, 
4010: 26 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  &p->pWhere);.   
4020: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4030: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4040: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
4050: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79  ce */.static Key
4060: 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f  Info *keyInfoFro
4070: 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
4080: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4090: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
40a0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
40b0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
40c0: 2a 20 46 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e  * Form the KeyIn
40d0: 66 6f 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74  fo object from t
40e0: 68 69 73 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a  his ExprList */.
40f0: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
4100: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
4110: 77 69 74 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e  with this column
4120: 20 6f 66 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69   of pList */.  i
4130: 6e 74 20 6e 45 78 74 72 61 20 20 20 20 20 20 20  nt nExtra       
4140: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
4150: 6d 61 6e 79 20 65 78 74 72 61 20 63 6f 6c 75 6d  many extra colum
4160: 6e 73 20 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f  ns to the end */
4170: 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .);../*.** Gener
4180: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
4190: 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f  ll push the reco
41a0: 72 64 20 69 6e 20 72 65 67 69 73 74 65 72 73 20  rd in registers 
41b0: 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75  regData.** throu
41c0: 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61 74 61  gh regData+nData
41d0: 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74  -1 onto the sort
41e0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
41f0: 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  id pushOntoSorte
4200: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
4210: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  se,         /* P
4220: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
4230: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
4240: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66  t,        /* Inf
4250: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
4260: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
4270: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  se */.  Select *
4280: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f  pSelect,       /
4290: 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45  * The whole SELE
42a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
42b0: 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c 20 20    int regData,  
42c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
42d0: 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  t register holdi
42e0: 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  ng data to be so
42f0: 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rted */.  int re
4300: 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20 20 20  gOrigData,      
4310: 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69 73 74   /* First regist
4320: 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  er holding data 
4330: 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67 20 2a  before packing *
4340: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  /.  int nData,  
4350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4360: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
4370: 20 69 6e 20 74 68 65 20 64 61 74 61 20 61 72 72   in the data arr
4380: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65  ay */.  int nPre
4390: 66 69 78 52 65 67 20 20 20 20 20 20 20 20 20 2f  fixReg         /
43a0: 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20 70 72 69  * No. of reg pri
43b0: 6f 72 20 74 6f 20 72 65 67 44 61 74 61 20 61 76  or to regData av
43c0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
43d0: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
43e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6d 74           /* Stmt
4410: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4420: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53 65  ion */.  int bSe
4430: 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e 73 6f 72  q = ((pSort->sor
4440: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
4450: 47 5f 55 73 65 53 6f 72 74 65 72 29 3d 3d 30 29  G_UseSorter)==0)
4460: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
4470: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
4480: 3e 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >nExpr;         
4490: 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f       /* No. of O
44a0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
44b0: 0a 20 20 69 6e 74 20 6e 42 61 73 65 20 3d 20 6e  .  int nBase = n
44c0: 45 78 70 72 20 2b 20 62 53 65 71 20 2b 20 6e 44  Expr + bSeq + nD
44d0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
44e0: 20 20 20 20 2f 2a 20 46 69 65 6c 64 73 20 69 6e      /* Fields in
44f0: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4500: 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b  /.  int regBase;
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 20 20 2f 2a 20 52 65 67 73 20 66 6f 72       /* Regs for
4540: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a   sorter record *
4550: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
4560: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
4570: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
4580: 20 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65       /* Assemble
4590: 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  d sorter record 
45a0: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20  */.  int nOBSat 
45b0: 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  = pSort->nOBSat;
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 20 20 20 20 20 2f 2a 20 4f 52 44 45 52 20 42        /* ORDER B
45e0: 59 20 74 65 72 6d 73 20 74 6f 20 73 6b 69 70 20  Y terms to skip 
45f0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64          /* Opcod
4620: 65 20 74 6f 20 61 64 64 20 73 6f 72 74 65 72 20  e to add sorter 
4630: 72 65 63 6f 72 64 20 74 6f 20 73 6f 72 74 65 72  record to sorter
4640: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   */.  int iLimit
4650: 3b 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 2f 2a 20 4c 49 4d 49           /* LIMI
4670: 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  T counter */..  
4680: 61 73 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20  assert( bSeq==0 
4690: 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b 0a 20 20  || bSeq==1 );.  
46a0: 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 31  assert( nData==1
46b0: 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72 65 67   || regData==reg
46c0: 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65 67 4f  OrigData || regO
46d0: 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20  rigData==0 );.  
46e0: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 20 29  if( nPrefixReg )
46f0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
4700: 72 65 66 69 78 52 65 67 3d 3d 6e 45 78 70 72 2b  refixReg==nExpr+
4710: 62 53 65 71 20 29 3b 0a 20 20 20 20 72 65 67 42  bSeq );.    regB
4720: 61 73 65 20 3d 20 72 65 67 44 61 74 61 20 2d 20  ase = regData - 
4730: 6e 45 78 70 72 20 2d 20 62 53 65 71 3b 0a 20 20  nExpr - bSeq;.  
4740: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42 61  }else{.    regBa
4750: 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  se = pParse->nMe
4760: 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72 73  m + 1;.    pPars
4770: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73 65  e->nMem += nBase
4780: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4790: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
47a0: 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d 3e  ==0 || pSelect->
47b0: 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  iLimit!=0 );.  i
47c0: 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d  Limit = pSelect-
47d0: 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c 65  >iOffset ? pSele
47e0: 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20  ct->iOffset+1 : 
47f0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b  pSelect->iLimit;
4800: 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44  .  pSort->labelD
4810: 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  one = sqlite3Vdb
4820: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4830: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
4840: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4850: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4860: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f 72  , regBase, regOr
4870: 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20  igData,.        
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55    SQLITE_ECEL_DU
48a0: 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74 61  P | (regOrigData
48b0: 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  ? SQLITE_ECEL_RE
48c0: 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20 62  F : 0));.  if( b
48d0: 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Seq ){.    sqlit
48e0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
48f0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53 6f  OP_Sequence, pSo
4900: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
4910: 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20 20  gBase+nExpr);.  
4920: 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52  }.  if( nPrefixR
4930: 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e 30  eg==0 && nData>0
4940: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4950: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
4960: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
4970: 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71 2c  Base+nExpr+bSeq,
4980: 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 73   nData);.  }.  s
4990: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
49a0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
49b0: 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42 53 61  d, regBase+nOBSa
49c0: 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61 74 2c  t, nBase-nOBSat,
49d0: 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 69   regRecord);.  i
49e0: 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  f( nOBSat>0 ){. 
49f0: 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b 65     int regPrevKe
4a00: 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  y;   /* The firs
4a10: 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e 73  t nOBSat columns
4a20: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
4a30: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74 20   row */.    int 
4a40: 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f 2a  addrFirst;    /*
4a50: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
4a60: 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65 20  OP_IfNot opcode 
4a70: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4a  */.    int addrJ
4a80: 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  mp;      /* Addr
4a90: 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a 75  ess of the OP_Ju
4aa0: 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  mp opcode */.   
4ab0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
4ac0: 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68 61     /* Opcode tha
4ad0: 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72 74  t opens the sort
4ae0: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4b  er */.    int nK
4af0: 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ey;         /* N
4b00: 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e 67  umber of sorting
4b10: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e   key columns, in
4b20: 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75 65  cluding OP_Seque
4b30: 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  nce */.    KeyIn
4b40: 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a 20  fo *pKI;     /* 
4b50: 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66 6f  Original KeyInfo
4b60: 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20 74   on the sorter t
4b70: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65 67  able */..    reg
4b80: 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72 73 65  PrevKey = pParse
4b90: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50  ->nMem+1;.    pP
4ba0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53  arse->nMem += pS
4bb0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20  ort->nOBSat;.   
4bc0: 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20 2d 20   nKey = nExpr - 
4bd0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20  pSort->nOBSat + 
4be0: 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20 62 53  bSeq;.    if( bS
4bf0: 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  eq ){.      addr
4c00: 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56  First = sqlite3V
4c10: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
4c20: 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e  IfNot, regBase+n
4c30: 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73  Expr); .    }els
4c40: 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72  e{.      addrFir
4c50: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
4c60: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71  AddOp1(v, OP_Seq
4c70: 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f 72 74  uenceTest, pSort
4c80: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
4c90: 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72   }.    VdbeCover
4ca0: 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
4cb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
4cc0: 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
4cd0: 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61 73 65  PrevKey, regBase
4ce0: 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29  , pSort->nOBSat)
4cf0: 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69  ;.    pOp = sqli
4d00: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
4d10: 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49  pSort->addrSortI
4d20: 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
4d30: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
4d40: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
4d50: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20  ;.    pOp->p2 = 
4d60: 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20  nKey + nData;.  
4d70: 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e    pKI = pOp->p4.
4d80: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65  pKeyInfo;.    me
4d90: 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f  mset(pKI->aSortO
4da0: 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46  rder, 0, pKI->nF
4db0: 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20  ield); /* Makes 
4dc0: 4f 50 5f 4a 75 6d 70 20 62 65 6c 6f 77 20 74 65  OP_Jump below te
4dd0: 73 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71  stable */.    sq
4de0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4df0: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29  4(v, -1, (char*)
4e00: 70 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  pKI, P4_KEYINFO)
4e10: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
4e20: 70 4b 49 2d 3e 6e 58 46 69 65 6c 64 3e 32 20 29  pKI->nXField>2 )
4e30: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b  ;.    pOp->p4.pK
4e40: 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
4e50: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
4e60: 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64  rse, pSort->pOrd
4e70: 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a 20 20  erBy, nOBSat,.  
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 58           pKI->nX
4eb0: 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61 64  Field-1);.    ad
4ec0: 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56  drJmp = sqlite3V
4ed0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4ee0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
4ef0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
4f00: 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c 20  ump, addrJmp+1, 
4f10: 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20 56  0, addrJmp+1); V
4f20: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
4f30: 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c      pSort->label
4f40: 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 56  BkOut = sqlite3V
4f50: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
4f60: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67 52  .    pSort->regR
4f70: 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
4f80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
4f90: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
4fa0: 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74   OP_Gosub, pSort
4fb0: 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f  ->regReturn, pSo
4fc0: 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b  rt->labelBkOut);
4fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4fe0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73  AddOp1(v, OP_Res
4ff0: 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74 2d  etSorter, pSort-
5000: 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  >iECursor);.    
5010: 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20  if( iLimit ){.  
5020: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5030: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp2(v, OP_IfNo
5040: 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72 74  t, iLimit, pSort
5050: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20 20  ->labelDone);.  
5060: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5070: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
5080: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
5090: 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74 29  re(v, addrFirst)
50a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
50b0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
50c0: 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50 72  , regBase, regPr
50d0: 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f  evKey, pSort->nO
50e0: 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  BSat);.    sqlit
50f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5100: 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a  , addrJmp);.  }.
5110: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
5120: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
5130: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
5140: 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65     op = OP_Sorte
5150: 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65  rInsert;.  }else
5160: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64  {.    op = OP_Id
5170: 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73  xInsert;.  }.  s
5180: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5190: 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74  Int(v, op, pSort
51a0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
51b0: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
51d0: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
51e0: 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69  ase-nOBSat);.  i
51f0: 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  f( iLimit ){.   
5200: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 69   int addr;.    i
5210: 6e 74 20 72 31 20 3d 20 30 3b 0a 20 20 20 20 2f  nt r1 = 0;.    /
5220: 2a 20 46 69 6c 6c 20 74 68 65 20 73 6f 72 74 65  * Fill the sorte
5230: 72 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  r until it conta
5240: 69 6e 73 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  ins LIMIT+OFFSET
5250: 20 65 6e 74 72 69 65 73 2e 20 20 28 54 68 65 20   entries.  (The 
5260: 69 4c 69 6d 69 74 0a 20 20 20 20 2a 2a 20 72 65  iLimit.    ** re
5270: 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
5280: 6c 69 7a 65 64 20 77 69 74 68 20 76 61 6c 75 65  lized with value
5290: 20 6f 66 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   of LIMIT+OFFSET
52a0: 2e 29 20 20 41 66 74 65 72 20 74 68 65 20 73 6f  .)  After the so
52b0: 72 74 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 6c  rter.    ** fill
52c0: 73 20 75 70 2c 20 64 65 6c 65 74 65 20 74 68 65  s up, delete the
52d0: 20 6c 65 61 73 74 20 65 6e 74 72 79 20 69 6e 20   least entry in 
52e0: 74 68 65 20 73 6f 72 74 65 72 20 61 66 74 65 72  the sorter after
52f0: 20 65 61 63 68 20 69 6e 73 65 72 74 2e 0a 20 20   each insert..  
5300: 20 20 2a 2a 20 54 68 75 73 20 77 65 20 6e 65 76    ** Thus we nev
5310: 65 72 20 68 6f 6c 64 20 6d 6f 72 65 20 74 68 61  er hold more tha
5320: 6e 20 74 68 65 20 4c 49 4d 49 54 2b 4f 46 46 53  n the LIMIT+OFFS
5330: 45 54 20 72 6f 77 73 20 69 6e 20 6d 65 6d 6f 72  ET rows in memor
5340: 79 20 61 74 20 6f 6e 63 65 20 2a 2f 0a 20 20 20  y at once */.   
5350: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
5360: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5370: 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69  IfNotZero, iLimi
5380: 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
5390: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
53a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
53b0: 5f 4c 61 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45  _Last, pSort->iE
53c0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28  Cursor);.    if(
53d0: 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64   pSort->bOrdered
53e0: 49 6e 6e 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20  InnerLoop ){.   
53f0: 20 20 20 72 31 20 3d 20 2b 2b 70 50 61 72 73 65     r1 = ++pParse
5400: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
5410: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5420: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53  v, OP_Column, pS
5430: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 6e  ort->iECursor, n
5440: 45 78 70 72 2c 20 72 31 29 3b 0a 20 20 20 20 20  Expr, r1);.     
5450: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
5460: 20 22 73 65 71 22 29 29 3b 0a 20 20 20 20 7d 0a   "seq"));.    }.
5470: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5480: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
5490: 74 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72  te, pSort->iECur
54a0: 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53  sor);.    if( pS
54b0: 6f 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e  ort->bOrderedInn
54c0: 65 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  erLoop ){.      
54d0: 2f 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  /* If the inner 
54e0: 6c 6f 6f 70 20 69 73 20 64 72 69 76 65 6e 20 62  loop is driven b
54f0: 79 20 61 6e 20 69 6e 64 65 78 20 73 75 63 68 20  y an index such 
5500: 74 68 61 74 20 76 61 6c 75 65 73 20 66 72 6f 6d  that values from
5510: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 61  .      ** the sa
5520: 6d 65 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  me iteration of 
5530: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61  the inner loop a
5540: 72 65 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  re in sorted ord
5550: 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  er, then.      *
5560: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 6a 75  * immediately ju
5570: 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
5580: 74 65 72 61 74 69 6f 6e 20 6f 66 20 61 6e 20 69  teration of an i
5590: 6e 6e 65 72 20 6c 6f 6f 70 20 69 66 20 74 68 65  nner loop if the
55a0: 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  .      ** entry 
55b0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
55c0: 20 69 74 65 72 61 74 69 6f 6e 20 64 6f 65 73 20   iteration does 
55d0: 6e 6f 74 20 66 69 74 20 69 6e 74 6f 20 74 68 65  not fit into the
55e0: 20 74 6f 70 0a 20 20 20 20 20 20 2a 2a 20 4c 49   top.      ** LI
55f0: 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74 72 69  MIT+OFFSET entri
5600: 65 73 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72  es of the sorter
5610: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  . */.      int i
5620: 42 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Brk = sqlite3Vdb
5630: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
5640: 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  + 2;.      sqlit
5650: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5660: 4f 50 5f 45 71 2c 20 72 65 67 42 61 73 65 2b 6e  OP_Eq, regBase+n
5670: 45 78 70 72 2c 20 69 42 72 6b 2c 20 72 31 29 3b  Expr, iBrk, r1);
5680: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5690: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51  beChangeP5(v, SQ
56a0: 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20  LITE_NULLEQ);.  
56b0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
56c0: 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  (v);.    }.    s
56d0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
56e0: 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 7d  re(v, addr);.  }
56f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
5700: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
5710: 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74  the OFFSET.*/.st
5720: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66  atic void codeOf
5730: 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  fset(.  Vdbe *v,
5740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
5750: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
5760: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
5770: 20 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f   iOffset,      /
5780: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
5790: 6e 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f  ng the offset co
57a0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
57b0: 43 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20  Continue     /* 
57c0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
57d0: 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  p the current re
57e0: 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  cord */.){.  if(
57f0: 20 69 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20   iOffset>0 ){.  
5800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5810: 4f 70 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op3(v, OP_IfPos,
5820: 20 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69   iOffset, iConti
5830: 6e 75 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76  nue, 1); VdbeCov
5840: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64  erage(v);.    Vd
5850: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
5860: 46 46 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a  FFSET"));.  }.}.
5870: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
5880: 74 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20  that will check 
5890: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
58a0: 20 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   N registers sta
58b0: 72 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a  rting at iMem.**
58c0: 20 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74   form a distinct
58d0: 20 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73   entry.  iTab is
58e0: 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
58f0: 20 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76   that holds prev
5900: 69 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63  iously.** seen c
5910: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74  ombinations of t
5920: 68 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20  he N values.  A 
5930: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64  new entry is mad
5940: 65 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20  e in iTab.** if 
5950: 74 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61  the current N va
5960: 6c 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a  lues are new..**
5970: 0a 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64  .** A jump to ad
5980: 64 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65  drRepeat is made
5990: 20 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c   and the N+1 val
59a0: 75 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66  ues are popped f
59b0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b  rom the.** stack
59c0: 20 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c   if the top N el
59d0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64  ements are not d
59e0: 69 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74  istinct..*/.stat
59f0: 69 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74  ic void codeDist
5a00: 69 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  inct(.  Parse *p
5a10: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
5a20: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5a30: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5a40: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c  t */.  int iTab,
5a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
5a60: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65  orting index use
5a70: 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69  d to test for di
5a80: 73 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20  stinctness */.  
5a90: 69 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20  int addrRepeat, 
5aa0: 20 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65     /* Jump to he
5ab0: 72 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e  re if not distin
5ac0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ct */.  int N,  
5ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5ae0: 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
5af0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20   */.  int iMem  
5b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
5b10: 74 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  t element */.){.
5b20: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74    Vdbe *v;.  int
5b30: 20 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72   r1;..  v = pPar
5b40: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20  se->pVdbe;.  r1 
5b50: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5b60: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
5b70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5b80: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5b90: 20 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61   iTab, addrRepea
5ba0: 74 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62  t, iMem, N); Vdb
5bb0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
5bc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5bd0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5be0: 72 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29  rd, iMem, N, r1)
5bf0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
5c00: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
5c10: 64 78 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20  dxInsert, iTab, 
5c20: 72 31 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20  r1, iMem, N);.  
5c30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5c40: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53  eP5(v, OPFLAG_US
5c50: 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20  ESEEKRESULT);.  
5c60: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
5c70: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
5c80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
5c90: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
5ca0: 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
5cb0: 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68  the inside of th
5cc0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
5cd0: 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  of a SELECT..**.
5ce0: 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73 20  ** If srcTab is 
5cf0: 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74  negative, then t
5d00: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
5d10: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
5d20: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
5d30: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
5d40: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
5d50: 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a  f srcTab is.** z
5d60: 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65  ero or more, the
5d70: 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64  n data is pulled
5d80: 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64   from srcTab and
5d90: 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20   pEList is used 
5da0: 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20  only .** to get 
5db0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
5dc0: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f  lumns and the co
5dd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
5de0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
5df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5e00: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
5e10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5e20: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
5e30: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
5e40: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
5e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5e60: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
5e70: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
5e80: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
5e90: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5ea0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
5eb0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
5ec0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
5ed0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
5ee0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
5ef0: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
5f00: 61 62 6c 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  able */.  SortCt
5f10: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
5f20: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
5f30: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
5f40: 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20 42   process ORDER B
5f50: 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  Y */.  DistinctC
5f60: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
5f70: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
5f80: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
5f90: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
5fa0: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
5fb0: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
5fc0: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
5fd0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
5fe0: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
5ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6000: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
6010: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
6020: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6040: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
6050: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
6060: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
6070: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
6080: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
6090: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
60a0: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20 20  tinct;          
60b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
60c0: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
60d0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
60e0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
60f0: 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a  est->eDest;   /*
6100: 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20   How to dispose 
6110: 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  of results */.  
6120: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73  int iParm = pDes
6130: 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46  t->iSDParm; /* F
6140: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
6150: 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64   disposal method
6160: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c   */.  int nResul
6170: 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
6180: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
6190: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
61a0: 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65  .  int nPrefixRe
61b0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  g = 0;         /
61c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
61d0: 61 20 72 65 67 69 73 74 65 72 73 20 62 65 66 6f  a registers befo
61e0: 72 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f 0a  re regResult */.
61f0: 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 2c 20 72  .  /* Usually, r
6200: 65 67 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  egResult is the 
6210: 66 69 72 73 74 20 63 65 6c 6c 20 69 6e 20 61 6e  first cell in an
6220: 20 61 72 72 61 79 20 6f 66 20 6d 65 6d 6f 72 79   array of memory
6230: 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74   cells.  ** cont
6240: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
6250: 6e 74 20 72 65 73 75 6c 74 20 72 6f 77 2e 20 49  nt result row. I
6260: 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f  n this case regO
6270: 72 69 67 20 69 73 20 73 65 74 20 74 6f 20 74 68  rig is set to th
6280: 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76 61 6c 75  e.  ** same valu
6290: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  e. However, if t
62a0: 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 62  he results are b
62b0: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 74 68 65  eing sent to the
62c0: 20 73 6f 72 74 65 72 2c 20 74 68 65 0a 20 20 2a   sorter, the.  *
62d0: 2a 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6e 79  * values for any
62e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
62f0: 74 20 61 72 65 20 61 6c 73 6f 20 70 61 72 74 20  t are also part 
6300: 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20  of the sort-key 
6310: 61 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 2a 2a  are omitted.  **
6320: 20 66 72 6f 6d 20 74 68 69 73 20 61 72 72 61 79   from this array
6330: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
6340: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
6350: 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74   zero.  */.  int
6360: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
6370: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
6380: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
6390: 69 6e 67 20 63 75 72 72 65 6e 74 20 72 65 73 75  ing current resu
63a0: 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  lts */.  int reg
63b0: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
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: 66 75 6c 6c 20 72 65 73 75 6c 74 20 28 6f 72 20  full result (or 
63f0: 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  0) */..  assert(
6400: 20 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   v );.  assert( 
6410: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
6420: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69  asDistinct = pDi
6430: 73 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e  stinct ? pDistin
6440: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20  ct->eTnctType : 
6450: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
6460: 4f 4f 50 3b 0a 20 20 69 66 28 20 70 53 6f 72 74  OOP;.  if( pSort
6470: 20 26 26 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65   && pSort->pOrde
6480: 72 42 79 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d  rBy==0 ) pSort =
6490: 20 30 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 3d   0;.  if( pSort=
64a0: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
64b0: 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
64c0: 28 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29  ( iContinue!=0 )
64d0: 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74  ;.    codeOffset
64e0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
64f0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a  iContinue);.  }.
6500: 0a 20 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72  .  /* Pull the r
6510: 65 71 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73  equested columns
6520: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74  ..  */.  nResult
6530: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
6540: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
6550: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
6560: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
6570: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
6580: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
6590: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
65a0: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
65b0: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
65c0: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
65d0: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
65e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
65f0: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
6600: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
6610: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
6620: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
6630: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
6640: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
6650: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
6660: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
6670: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
6680: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
6690: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
66a0: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
66b0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
66c0: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
66d0: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
66e0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
66f0: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
6700: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
6710: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
6720: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
6730: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
6740: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
6750: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
6760: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
6770: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
6780: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
6790: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
67a0: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
67b0: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
67c0: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
67d0: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
67e0: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
67f0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
6800: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
6810: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
6820: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
6830: 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20 72 65  ;.  regOrig = re
6840: 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d  gResult = pDest-
6850: 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72  >iSdst;.  if( sr
6860: 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66  cTab>=0 ){.    f
6870: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
6880: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
6890: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
68a0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
68b0: 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67  , srcTab, i, reg
68c0: 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20  Result+i);.     
68d0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
68e0: 20 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61   "%s", pEList->a
68f0: 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  [i].zName));.   
6900: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
6910: 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
6920: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
6930: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73  e destination is
6940: 20 61 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20   an EXISTS(...) 
6950: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20  expression, the 
6960: 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61  actual.    ** va
6970: 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  lues returned by
6980: 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
6990: 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
69a0: 20 20 2a 2f 0a 20 20 20 20 75 38 20 65 63 65 6c    */.    u8 ecel
69b0: 46 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 65  Flags;.    if( e
69c0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
69d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
69e0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
69f0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
6a00: 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20      ecelFlags = 
6a10: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3b  SQLITE_ECEL_DUP;
6a20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6a30: 20 20 65 63 65 6c 46 6c 61 67 73 20 3d 20 30 3b    ecelFlags = 0;
6a40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
6a50: 53 6f 72 74 20 26 26 20 68 61 73 44 69 73 74 69  Sort && hasDisti
6a60: 6e 63 74 3d 3d 30 20 26 26 20 65 44 65 73 74 21  nct==0 && eDest!
6a70: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 26 26  =SRT_EphemTab &&
6a80: 20 65 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c   eDest!=SRT_Tabl
6a90: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  e ){.      /* Fo
6aa0: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
6ab0: 6e 20 69 6e 20 70 45 4c 69 73 74 20 74 68 61 74  n in pEList that
6ac0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6e   is a copy of an
6ad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20   expression in. 
6ae0: 20 20 20 20 20 2a 2a 20 74 68 65 20 4f 52 44 45       ** the ORDE
6af0: 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 6f  R BY clause (pSo
6b00: 72 74 2d 3e 70 4f 72 64 65 72 42 79 29 2c 20 73  rt->pOrderBy), s
6b10: 65 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  et the associate
6b20: 64 20 0a 20 20 20 20 20 20 2a 2a 20 69 4f 72 64  d .      ** iOrd
6b30: 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f  erByCol value to
6b40: 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74   one more than t
6b50: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
6b60: 4f 52 44 45 52 20 42 59 20 0a 20 20 20 20 20 20  ORDER BY .      
6b70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  ** expression wi
6b80: 74 68 69 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65  thin the sort-ke
6b90: 79 20 74 68 61 74 20 70 75 73 68 4f 6e 74 6f 53  y that pushOntoS
6ba0: 6f 72 74 65 72 28 29 20 77 69 6c 6c 20 67 65 6e  orter() will gen
6bb0: 65 72 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20  erate..      ** 
6bc0: 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20  This allows the 
6bd0: 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74 6f 20  pEList field to 
6be0: 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  be omitted from 
6bf0: 74 68 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72  the sorted recor
6c00: 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 69  d,.      ** savi
6c10: 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43 50 55  ng space and CPU
6c20: 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20   cycles.  */.   
6c30: 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20     ecelFlags |= 
6c40: 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49  (SQLITE_ECEL_OMI
6c50: 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c  TREF|SQLITE_ECEL
6c60: 5f 52 45 46 29 3b 0a 20 20 20 20 20 20 66 6f 72  _REF);.      for
6c70: 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  (i=pSort->nOBSat
6c80: 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65  ; i<pSort->pOrde
6c90: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
6ca0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
6cb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6a 20  .        if( (j 
6cc0: 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  = pSort->pOrderB
6cd0: 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  y->a[i].u.x.iOrd
6ce0: 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20  erByCol)>0 ){.  
6cf0: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e          pEList->
6d00: 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65  a[j-1].u.x.iOrde
6d10: 72 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f  rByCol = i+1-pSo
6d20: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
6d30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6d40: 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b      regOrig = 0;
6d50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
6d60: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c  Dest==SRT_Set ||
6d70: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
6d80: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
6d90: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
6da0: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
6db0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
6dc0: 7d 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  }.    nResultCol
6dd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
6de0: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
6df0: 65 2c 70 45 4c 69 73 74 2c 72 65 67 52 65 73 75  e,pEList,regResu
6e00: 6c 74 2c 30 2c 65 63 65 6c 46 6c 61 67 73 29 3b  lt,0,ecelFlags);
6e10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
6e20: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
6e30: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
6e40: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
6e50: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
6e60: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
6e70: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
6e80: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
6e90: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
6ea0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
6eb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
6ec0: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
6ed0: 73 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63  switch( pDistinc
6ee0: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a  t->eTnctType ){.
6ef0: 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
6f00: 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
6f10: 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62  D: {.        Vdb
6f20: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20  eOp *pOp;       
6f30: 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65       /* No longe
6f40: 72 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45  r required OpenE
6f50: 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20  phemeral instr. 
6f60: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
6f70: 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20  Jump;           
6f80: 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69     /* Jump desti
6f90: 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nation */.      
6fa0: 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
6fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
6fc0: 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e  vious row conten
6fd0: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  t */..        /*
6fe0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
6ff0: 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
7000: 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20   row */.        
7010: 72 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65  regPrev = pParse
7020: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20  ->nMem+1;.      
7030: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
7040: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20  = nResultCol;.. 
7050: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
7060: 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
7070: 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c  meral coded earl
7080: 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c  ier to an OP_Nul
7090: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  l.        ** set
70a0: 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65  s the MEM_Cleare
70b0: 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72  d bit on the fir
70c0: 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  st register of t
70d0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
70e0: 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54  evious value.  T
70f0: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
7100: 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74  he OP_Ne below t
7110: 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20  o always.       
7120: 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   ** fail on the 
7130: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
7140: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e  of the loop even
7150: 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
7160: 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20        ** row is 
7170: 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20  all NULLs..     
7180: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
7190: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
71a0: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
71b0: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
71c0: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
71d0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
71e0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
71f0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Tnct);.        p
7200: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
7210: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Null;.        pO
7220: 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->p1 = 1;.     
7230: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67     pOp->p2 = reg
7240: 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69  Prev;..        i
7250: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
7260: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
7270: 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   + nResultCol;. 
7280: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
7290: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
72a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f  +){.          Co
72b0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
72c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
72d0: 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  q(pParse, pEList
72e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
72f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e           if( i<n
7300: 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20  ResultCol-1 ){. 
7310: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7320: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7330: 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74  OP_Ne, regResult
7340: 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72  +i, iJump, regPr
7350: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
7360: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
7370: 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  v);.          }e
7380: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
7390: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
73a0: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67  p3(v, OP_Eq, reg
73b0: 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69  Result+i, iConti
73c0: 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  nue, regPrev+i);
73d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 56 64 62  .            Vdb
73e0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
73f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7400: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7410: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
7420: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
7430: 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29  oll, P4_COLLSEQ)
7440: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
7450: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7460: 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51  v, SQLITE_NULLEQ
7470: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7480: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
7490: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
74a0: 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c  ddr(v)==iJump ||
74b0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
74c0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
74d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
74e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
74f0: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
7500: 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f  gPrev, nResultCo
7510: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  l-1);.        br
7520: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
7530: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
7540: 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
7550: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7560: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
7570: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
7580: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
7590: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
75a0: 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
75b0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
75c0: 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  rt( pDistinct->e
75d0: 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
75e0: 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
75f0: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ED );.        co
7600: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
7610: 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61  e, pDistinct->ta
7620: 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  bTnct, iContinue
7630: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20  , nResultCol,.  
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7650: 20 20 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20     regResult);. 
7660: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7680: 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a  if( pSort==0 ){.
7690: 20 20 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74        codeOffset
76a0: 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20  (v, p->iOffset, 
76b0: 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  iContinue);.    
76c0: 7d 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28  }.  }..  switch(
76d0: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a   eDest ){.    /*
76e0: 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77   In this mode, w
76f0: 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20  rite each query 
7700: 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65  result to the ke
7710: 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  y of the tempora
7720: 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  ry.    ** table 
7730: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69  iParm..    */.#i
7740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7750: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
7760: 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55  T.    case SRT_U
7770: 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  nion: {.      in
7780: 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d  t r1;.      r1 =
7790: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
77a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
77b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
77c0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
77d0: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
77e0: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29   nResultCol, r1)
77f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7800: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7810: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7820: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
7830: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
7840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
7850: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
7860: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
7870: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7880: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
7890: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
78a0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62   query result, b
78b0: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  ut instead of.  
78c0: 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74    ** saving that
78d0: 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20   record, use it 
78e0: 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65  as a key to dele
78f0: 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  te elements from
7900: 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70  .    ** the temp
7910: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72  orary table iPar
7920: 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  m..    */.    ca
7930: 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b  se SRT_Except: {
7940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7950: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
7960: 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c  dxDelete, iParm,
7970: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
7980: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62  ultCol);.      b
7990: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
79a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
79b0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
79c0: 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f  T */..    /* Sto
79d0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
79e0: 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
79f0: 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
7a00: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 46 69  .    case SRT_Fi
7a10: 66 6f 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  fo:.    case SRT
7a20: 5f 44 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63  _DistFifo:.    c
7a30: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
7a40: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
7a50: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
7a60: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
7a70: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
7a80: 65 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29  e, nPrefixReg+1)
7a90: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7aa0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62  ( eDest==SRT_Tab
7ab0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  le );.      test
7ac0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
7ad0: 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20  _EphemTab );.   
7ae0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
7af0: 73 74 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st==SRT_Fifo );.
7b00: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7b10: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46  eDest==SRT_DistF
7b20: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ifo );.      sql
7b30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7b40: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
7b50: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
7b60: 75 6c 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66  ultCol, r1+nPref
7b70: 69 78 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20  ixReg);.#ifndef 
7b80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
7b90: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
7ba0: 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b  =SRT_DistFifo ){
7bb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
7bc0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
7bd0: 73 20 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e  s DistFifo, then
7be0: 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31   cursor (iParm+1
7bf0: 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20  ) is open.      
7c00: 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d    ** on an ephem
7c10: 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74  eral index. If t
7c20: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69  he current row i
7c30: 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e  s already presen
7c40: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  t.        ** in 
7c50: 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f  the index, do no
7c60: 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68  t write it to th
7c70: 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74  e output. If not
7c80: 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20  , add the.      
7c90: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77    ** current row
7ca0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e   to the index an
7cb0: 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77  d proceed with w
7cc0: 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65  riting it to the
7cd0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
7ce0: 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c  ut table as well
7cf0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  .  */.        in
7d00: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
7d10: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
7d20: 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  v) + 4;.        
7d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7d40: 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  4Int(v, OP_Found
7d50: 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c  , iParm+1, addr,
7d60: 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   r1, 0);.       
7d70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7d80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7d90: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
7da0: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
7db0: 69 50 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52  iParm+1, r1,regR
7dc0: 65 73 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c  esult,nResultCol
7dd0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
7de0: 74 28 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20  t( pSort==0 );. 
7df0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
7e00: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
7e10: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
7e20: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
7e30: 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72  pSort, p, r1+nPr
7e40: 65 66 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c  efixReg,regResul
7e50: 74 2c 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b  t,1,nPrefixReg);
7e60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7e70: 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
7e80: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
7e90: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
7ea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7eb0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
7ec0: 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a  id, iParm, r2);.
7ed0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7ee0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7ef0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
7f00: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  1, r2);.        
7f10: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7f20: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7f30: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73  PEND);.        s
7f40: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
7f50: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
7f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7f70: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
7f80: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
7f90: 72 31 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31  r1, nPrefixReg+1
7fa0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7fb0: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
7fc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7fd0: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
7fe0: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
7ff0: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
8000: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
8010: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
8020: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
8030: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
8040: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
8050: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
8060: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
8070: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
8080: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
8090: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
80a0: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
80b0: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
80c0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
80d0: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
80e0: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
80f0: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
8100: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
8110: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
8120: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
8130: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
8140: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
8150: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
8160: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
8170: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
8180: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
8190: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
81a0: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
81b0: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
81c0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
81d0: 74 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20  ter(.           
81e0: 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20   pParse, pSort, 
81f0: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
8200: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
8210: 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  l, nPrefixReg);.
8220: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8230: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
8240: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
8250: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
8260: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8270: 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e  Strlen30(pDest->
8280: 7a 41 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75  zAffSdst)==nResu
8290: 6c 74 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20  ltCol );.       
82a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
82b0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
82c0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
82d0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20  nResultCol, .   
82e0: 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65           r1, pDe
82f0: 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52  st->zAffSdst, nR
8300: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
8310: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
8320: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
8330: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
8340: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
8350: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8360: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
8370: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
8380: 69 50 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65  iParm, r1, regRe
8390: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
83a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
83b0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
83c0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
83d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
83e0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
83f0: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
8400: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
8410: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
8420: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
8430: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
8440: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
8450: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8460: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
8470: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
8480: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
8490: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
84a0: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
84b0: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
84c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
84d0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
84e0: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
84f0: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
8500: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
8510: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
8520: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
8530: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
8540: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f  te memory cell o
8550: 72 20 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20  r array of .    
8560: 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ** memory cells 
8570: 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66  and break out of
8580: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
8590: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
85a0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
85b0: 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20   if( pSort ){.  
85c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
85d0: 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d  esultCol<=pDest-
85e0: 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20  >nSdst );.      
85f0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
8600: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
8610: 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20  arse, pSort, p, 
8620: 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72  regResult, regOr
8630: 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  ig, nResultCol, 
8640: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
8650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8660: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
8670: 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol==pDest->nSd
8680: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  st );.        as
8690: 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d  sert( regResult=
86a0: 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20  =iParm );.      
86b0: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
86c0: 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
86d0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
86e0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
86f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8700: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
8710: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8720: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
8730: 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
8740: 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a  outine:       /*
8750: 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20   Send data to a 
8760: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
8770: 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75    case SRT_Outpu
8780: 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52  t: {        /* R
8790: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
87a0: 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  s */.      testc
87b0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
87c0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20  Coroutine );.   
87d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
87e0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
87f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f 72  ;.      if( pSor
8800: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  t ){.        pus
8810: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
8820: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
8830: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
8840: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20  , nResultCol,.  
8850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8860: 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67 29       nPrefixReg)
8870: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8880: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
8890: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
88a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
88b0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
88c0: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
88d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
88e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
88f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
8900: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
8910: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
8920: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8930: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8940: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8950: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
8960: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d  ultCol);.      }
8970: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8980: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
8990: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
89a0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65   /* Write the re
89b0: 73 75 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69  sults into a pri
89c0: 6f 72 69 74 79 20 71 75 65 75 65 20 74 68 61 74  ority queue that
89d0: 20 69 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64   is order accord
89e0: 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44  ing to.    ** pD
89f0: 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69  est->pOrderBy (i
8a00: 6e 20 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e  n pSO).  pDest->
8a10: 69 53 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72  iSDParm (in iPar
8a20: 6d 29 20 69 73 20 74 68 65 20 63 75 72 73 6f 72  m) is the cursor
8a30: 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69   for an.    ** i
8a40: 6e 64 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e  ndex with pSO->n
8a50: 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20  Expr+2 columns. 
8a60: 20 42 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69   Build a key usi
8a70: 6e 67 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66  ng pSO for the f
8a80: 69 72 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d  irst.    ** pSO-
8a90: 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20  >nExpr columns, 
8aa0: 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61  then make sure a
8ab0: 6c 6c 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71  ll keys are uniq
8ac0: 75 65 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20  ue by adding a. 
8ad0: 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53     ** final OP_S
8ae0: 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20  equence column. 
8af0: 20 54 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   The last column
8b00: 20 69 73 20 74 68 65 20 72 65 63 6f 72 64 20 61   is the record a
8b10: 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f  s a blob..    */
8b20: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69  .    case SRT_Di
8b30: 73 74 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73  stQueue:.    cas
8b40: 65 20 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20  e SRT_Queue: {. 
8b50: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20       int nKey;. 
8b60: 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
8b70: 20 72 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61   r3;.      int a
8b80: 64 64 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20  ddrTest = 0;.   
8b90: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f     ExprList *pSO
8ba0: 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44  ;.      pSO = pD
8bb0: 65 73 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  est->pOrderBy;. 
8bc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 4f       assert( pSO
8bd0: 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d   );.      nKey =
8be0: 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pSO->nExpr;.   
8bf0: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
8c00: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
8c10: 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71  );.      r2 = sq
8c20: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
8c30: 65 28 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32  e(pParse, nKey+2
8c40: 29 3b 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32  );.      r3 = r2
8c50: 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69  +nKey+1;.      i
8c60: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  f( eDest==SRT_Di
8c70: 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20  stQueue ){.     
8c80: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
8c90: 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74  tination is Dist
8ca0: 51 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73  Queue, then curs
8cb0: 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20  or (iParm+1) is 
8cc0: 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
8cd0: 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65  on a second ephe
8ce0: 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74  meral index that
8cf0: 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65   holds all value
8d00: 73 20 65 76 65 72 79 20 70 72 65 76 69 6f 75 73  s every previous
8d10: 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64  ly.        ** ad
8d20: 64 65 64 20 74 6f 20 74 68 65 20 71 75 65 75 65  ded to the queue
8d30: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64  . */.        add
8d40: 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  rTest = sqlite3V
8d50: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
8d60: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
8d70: 31 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  1, 0, .         
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
8da0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
8db0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56  tCol);.        V
8dc0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
8dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
8de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8df0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
8e00: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
8e10: 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20  sultCol, r3);.  
8e20: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
8e30: 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a  RT_DistQueue ){.
8e40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8e50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8e60: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
8e70: 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20  +1, r3);.       
8e80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8e90: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
8ea0: 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
8eb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
8ec0: 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b  (i=0; i<nKey; i+
8ed0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
8ee0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8ef0: 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20   OP_SCopy,.     
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b       regResult +
8f20: 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69   pSO->a[i].u.x.i
8f30: 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a  OrderByCol - 1,.
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 20 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b            r2+i);
8f60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8f70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8f80: 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
8f90: 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29   iParm, r2+nKey)
8fa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8fb0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8fc0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20  MakeRecord, r2, 
8fd0: 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20  nKey+2, r1);.   
8fe0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8ff0: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64  dOp4Int(v, OP_Id
9000: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
9010: 72 31 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b  r1, r2, nKey+2);
9020: 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54  .      if( addrT
9030: 65 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62  est ) sqlite3Vdb
9040: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
9050: 72 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  rTest);.      sq
9060: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
9070: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
9080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
9090: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
90a0: 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b  Parse, r2, nKey+
90b0: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
90c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
90d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
90e0: 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69   */....#if !defi
90f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
9100: 54 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20  TRIGGER).    /* 
9110: 44 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75  Discard the resu
9120: 6c 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  lts.  This is us
9130: 65 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74  ed for SELECT st
9140: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a  atements inside.
9150: 20 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20      ** the body 
9160: 6f 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54  of a TRIGGER.  T
9170: 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75  he purpose of su
9180: 63 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f  ch selects is to
9190: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   call.    ** use
91a0: 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
91b0: 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69  ons that have si
91c0: 64 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20  de effects.  We 
91d0: 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20  do not care.    
91e0: 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74  ** about the act
91f0: 75 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74  ual results of t
9200: 68 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a  he select..    *
9210: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
9220: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
9230: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
9240: 64 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d );.      break
9250: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
9260: 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
9270: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9280: 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
9290: 54 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45  T is reached.  E
92a0: 78 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74  xcept, if.  ** t
92b0: 68 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72  here is a sorter
92c0: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  , in which case 
92d0: 74 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61  the sorter has a
92e0: 6c 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20  lready limited. 
92f0: 20 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66   ** the output f
9300: 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  or us..  */.  if
9310: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d  ( pSort==0 && p-
9320: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >iLimit ){.    s
9330: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9340: 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a  (v, OP_DecrJumpZ
9350: 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20  ero, p->iLimit, 
9360: 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
9370: 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a  erage(v);.  }.}.
9380: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
9390: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
93a0: 20 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20   sufficient for 
93b0: 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65  an index of N ke
93c0: 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a  y columns and.**
93d0: 20 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73   X extra columns
93e0: 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
93f0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
9400: 63 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  c(sqlite3 *db, i
9410: 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20  nt N, int X){.  
9420: 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b  int nExtra = (N+
9430: 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53  X)*(sizeof(CollS
9440: 65 71 2a 29 2b 31 29 3b 0a 20 20 4b 65 79 49 6e  eq*)+1);.  KeyIn
9450: 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44  fo *p = sqlite3D
9460: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
9470: 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
9480: 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66   + nExtra);.  if
9490: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53  ( p ){.    p->aS
94a0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
94b0: 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a  &p->aColl[N+X];.
94c0: 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20      p->nField = 
94d0: 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e  (u16)N;.    p->n
94e0: 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b  XField = (u16)X;
94f0: 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e  .    p->enc = EN
9500: 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62  C(db);.    p->db
9510: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52   = db;.    p->nR
9520: 65 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73  ef = 1;.    mems
9530: 65 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78  et(&p[1], 0, nEx
9540: 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tra);.  }else{. 
9550: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
9560: 6c 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65  lt(db);.  }.  re
9570: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
9580: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65   Deallocate a Ke
9590: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
95a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49  void sqlite3KeyI
95b0: 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f  nfoUnref(KeyInfo
95c0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
95d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
95e0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
95f0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
9600: 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71   p->nRef==0 ) sq
9610: 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70 2d  lite3DbFreeNN(p-
9620: 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  >db, p);.  }.}..
9630: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77  /*.** Make a new
9640: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
9650: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
9660: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
9670: 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e  KeyInfoRef(KeyIn
9680: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
9690: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
96a0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
96b0: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  p->nRef++;.  }. 
96c0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69   return p;.}..#i
96d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
96e0: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  G./*.** Return T
96f0: 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f  RUE if a KeyInfo
9700: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63   object can be c
9710: 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49  hange.  The KeyI
9720: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61  nfo object.** ca
9730: 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  n only be change
9740: 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  d if this is jus
9750: 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72  t a single refer
9760: 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65  ence to the obje
9770: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ct..**.** This r
9780: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
9790: 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73  nly inside of as
97a0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
97b0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
97c0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
97d0: 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ble(KeyInfo *p){
97e0: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
97f0: 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =1; }.#endif /* 
9800: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
9810: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
9820: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
9830: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
9840: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
9850: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
9860: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
9870: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
9880: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
9890: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
98a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
98b0: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
98c0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
98d0: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
98e0: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
98f0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
9900: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
9910: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
9920: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
9930: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
9940: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
9950: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
9960: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
9970: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
9980: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
9990: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
99a0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
99b0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
99c0: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
99d0: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
99e0: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
99f0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
9a00: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
9a10: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
9a20: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
9a30: 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   The calling.** 
9a40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
9a50: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69  onsible for seei
9a60: 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72  ng that this str
9a70: 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75  ucture is eventu
9a80: 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a  ally.** freed..*
9a90: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
9aa0: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
9ab0: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
9ac0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
9ad0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9ae0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9af0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
9b00: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
9b10: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
9b20: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
9b30: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
9b40: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
9b50: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
9b60: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
9b70: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
9b80: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
9b90: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
9ba0: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a  o the end */.){.
9bb0: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b    int nExpr;.  K
9bc0: 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20  eyInfo *pInfo;. 
9bd0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9be0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
9bf0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9c00: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
9c10: 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c  i;..  nExpr = pL
9c20: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
9c30: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
9c40: 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45  InfoAlloc(db, nE
9c50: 78 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78 74  xpr-iStart, nExt
9c60: 72 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49 6e  ra+1);.  if( pIn
9c70: 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  fo ){.    assert
9c80: 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
9c90: 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66  IsWriteable(pInf
9ca0: 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  o) );.    for(i=
9cb0: 69 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c  iStart, pItem=pL
9cc0: 69 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69  ist->a+iStart; i
9cd0: 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  <nExpr; i++, pIt
9ce0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c  em++){.      Col
9cf0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
9d00: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
9d10: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
9d20: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
9d30: 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  pr);.      if( !
9d40: 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20  pColl ) pColl = 
9d50: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
9d60: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
9d70: 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 43  l[i-iStart] = pC
9d80: 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f  oll;.      pInfo
9d90: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 2d 69  ->aSortOrder[i-i
9da0: 53 74 61 72 74 5d 20 3d 20 70 49 74 65 6d 2d 3e  Start] = pItem->
9db0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d  sortOrder;.    }
9dc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49  .  }.  return pI
9dd0: 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61  nfo;.}../*.** Na
9de0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
9df0: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
9e00: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
9e10: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
9e20: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
9e30: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
9e40: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
9e50: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
9e60: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
9e70: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
9e80: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
9e90: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
9ea0: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
9eb0: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
9ec0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
9ed0: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
9ee0: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
9ef0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
9f00: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
9f10: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
9f20: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
9f30: 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  z;.}..#ifndef SQ
9f40: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
9f50: 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  N./*.** Unless a
9f60: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
9f70: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
9f80: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
9f90: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
9fa0: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
9fb0: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
9fc0: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
9fd0: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
9fe0: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
9ff0: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
a000: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
a010: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54  :.**.**   "USE T
a020: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78  EMP B-TREE FOR x
a030: 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  xx".**.** where 
a040: 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44  xxx is one of "D
a050: 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52  ISTINCT", "ORDER
a060: 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42   BY" or "GROUP B
a070: 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63  Y". Exactly whic
a080: 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e  h.** is determin
a090: 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67 65  ed by the zUsage
a0a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
a0b0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
a0c0: 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65  nTempTable(Parse
a0d0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
a0e0: 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20  char *zUsage){. 
a0f0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
a100: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
a110: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
a120: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
a130: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
a140: 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
a150: 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d  db, "USE TEMP B-
a160: 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55  TREE FOR %s", zU
a170: 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  sage);.    sqlit
a180: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
a190: 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
a1a0: 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
a1b0: 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  , 0, zMsg, P4_DY
a1c0: 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  NAMIC);.  }.}../
a1d0: 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72  *.** Assign expr
a1e0: 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c  ession b to lval
a1f0: 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20  ue a. A second, 
a200: 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f  no-op, version o
a210: 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20  f this macro.** 
a220: 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e  is provided when
a230: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
a240: 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e  LAIN is defined.
a250: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
a260: 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69   code.** in sqli
a270: 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61  te3Select() to a
a280: 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20  ssign values to 
a290: 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72  structure member
a2a0: 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a   variables that.
a2b0: 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66  ** only exist if
a2c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
a2d0: 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69  LAIN is not defi
a2e0: 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c  ned without poll
a2f0: 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64  uting the.** cod
a300: 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20 64  e with #ifndef d
a310: 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20  irectives..*/.# 
a320: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
a330: 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61  tInteger(a, b) a
a340: 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e   = b..#else./* N
a350: 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66  o-op versions of
a360: 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28   the explainXXX(
a370: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  ) functions and 
a380: 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66  macros. */.# def
a390: 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  ine explainTempT
a3a0: 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69  able(y,z).# defi
a3b0: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
a3c0: 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66  eger(y,z).#endif
a3d0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
a3e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a3f0: 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  IN) && !defined(
a400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
a410: 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a  OUND_SELECT)./*.
a420: 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58  ** Unless an "EX
a430: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
a440: 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69  " command is bei
a450: 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68  ng processed, th
a460: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
a470: 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
a480: 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20  wise, it adds a 
a490: 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75  single row of ou
a4a0: 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20  tput to the EQP 
a4b0: 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65  result,.** where
a4c0: 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20   the caption is 
a4d0: 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77  of one of the tw
a4e0: 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20  o forms:.**.**  
a4f0: 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51   "COMPOSITE SUBQ
a500: 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64  UERIES iSub1 and
a510: 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20   iSub2 (op)".** 
a520: 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42    "COMPOSITE SUB
a530: 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e  QUERIES iSub1 an
a540: 64 20 69 53 75 62 32 20 55 53 49 4e 47 20 54 45  d iSub2 USING TE
a550: 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a  MP B-TREE (op)".
a560: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62  **.** where iSub
a570: 31 20 61 6e 64 20 69 53 75 62 32 20 61 72 65 20  1 and iSub2 are 
a580: 74 68 65 20 69 6e 74 65 67 65 72 73 20 70 61 73  the integers pas
a590: 73 65 64 20 61 73 20 74 68 65 20 63 6f 72 72 65  sed as the corre
a5a0: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63  sponding.** func
a5b0: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c  tion parameters,
a5c0: 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74   and op is the t
a5d0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
a5e0: 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  on of the parame
a5f0: 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  ter.** of the sa
a600: 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72  me name. The par
a610: 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74  ameter "op" must
a620: 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e   be one of TK_UN
a630: 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a  ION, TK_EXCEPT,.
a640: 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  ** TK_INTERSECT 
a650: 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66  or TK_ALL. The f
a660: 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65  irst form is use
a670: 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55  d if argument bU
a680: 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c  seTmp is .** fal
a690: 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e  se, or the secon
a6a0: 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20  d form if it is 
a6b0: 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
a6c0: 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70  void explainComp
a6d0: 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a  osite(.  Parse *
a6e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
a6f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
a700: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  e context */.  i
a710: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
a720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a730: 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  * One of TK_UNIO
a740: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63  N, TK_EXCEPT etc
a750: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31  . */.  int iSub1
a760: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a770: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
a780: 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74  ry id 1 */.  int
a790: 20 69 53 75 62 32 2c 20 20 20 20 20 20 20 20 20   iSub2,         
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a7b0: 53 75 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f  Subquery id 2 */
a7c0: 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20  .  int bUseTmp  
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7e0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
a7f0: 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75  temp table was u
a800: 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  sed */.){.  asse
a810: 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e  rt( op==TK_UNION
a820: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   || op==TK_EXCEP
a830: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45  T || op==TK_INTE
a840: 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  RSECT || op==TK_
a850: 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ALL );.  if( pPa
a860: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
a870: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
a880: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a890: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
a8a0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
a8b0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
a8c0: 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53  >db, "COMPOUND S
a8d0: 55 42 51 55 45 52 49 45 53 20 25 64 20 41 4e 44  UBQUERIES %d AND
a8e0: 20 25 64 20 25 73 28 25 73 29 22 2c 20 69 53 75   %d %s(%s)", iSu
a8f0: 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20  b1, iSub2,.     
a900: 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e     bUseTmp?"USIN
a910: 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a  G TEMP B-TREE ":
a920: 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  "", selectOpName
a930: 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  (op).    );.    
a940: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a950: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
a960: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
a970: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
a980: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
a990: 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  .}.#else./* No-o
a9a0: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
a9b0: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
a9c0: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
a9d0: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
a9e0: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
a9f0: 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  e(v,w,x,y,z).#en
aa00: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
aa10: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73  e inner loop was
aa20: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
aa30: 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64   a non-null pOrd
aa40: 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  erBy argument,.*
aa50: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  * then the resul
aa60: 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69  ts were placed i
aa70: 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74  n a sorter.  Aft
aa80: 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74  er the loop is t
aa90: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20  erminated.** we 
aaa0: 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20  need to run the 
aab0: 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75  sorter and outpu
aac0: 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  t the results.  
aad0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  The following.**
aae0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
aaf0: 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64  es the code need
ab00: 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ed to do that..*
ab10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
ab20: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a  nerateSortTail(.
ab30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ab40: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
ab50: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
ab60: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
ab70: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
ab80: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43  ement */.  SortC
ab90: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20  tx *pSort,   /* 
aba0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74  Information on t
abb0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
abc0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  se */.  int nCol
abd0: 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d  umn,      /* Num
abe0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
abf0: 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  f data */.  Sele
ac00: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a  ctDest *pDest /*
ac10: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
ac20: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
ac30: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
ac40: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
ac70: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
ac80: 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b  .  int addrBreak
ac90: 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44   = pSort->labelD
aca0: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  one;            
acb0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
acc0: 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  exit loop */.  i
acd0: 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20  nt addrContinue 
ace0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
acf0: 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a  eLabel(v);  /* J
ad00: 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78  ump here for nex
ad10: 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
ad20: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 61 64 64   addr;.  int add
ad30: 72 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74  rOnce = 0;.  int
ad40: 20 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73   iTab;.  ExprLis
ad50: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
ad60: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  ort->pOrderBy;. 
ad70: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
ad80: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
ad90: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
ada0: 69 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72  iSDParm;.  int r
adb0: 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67  egRow;.  int reg
adc0: 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f  Rowid;.  int iCo
add0: 6c 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  l;.  int nKey;. 
ade0: 20 69 6e 74 20 69 53 6f 72 74 54 61 62 3b 20 20   int iSortTab;  
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 2f 2a 20 53 6f 72 74 65 72 20 63 75 72 73 6f   /* Sorter curso
ae10: 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  r to read from *
ae20: 2f 0a 20 20 69 6e 74 20 6e 53 6f 72 74 44 61 74  /.  int nSortDat
ae30: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
ae40: 20 20 20 20 2f 2a 20 54 72 61 69 6c 69 6e 67 20      /* Trailing 
ae50: 76 61 6c 75 65 73 20 74 6f 20 72 65 61 64 20 66  values to read f
ae60: 72 6f 6d 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  rom sorter */.  
ae70: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65  int i;.  int bSe
ae80: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
ae90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
aea0: 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72   if sorter recor
aeb0: 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20  d includes seq. 
aec0: 6e 6f 2e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  no. */.  struct 
aed0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
aee0: 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c 69 73  OutEx = p->pELis
aef0: 74 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  t->a;..  assert(
af00: 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29 3b 0a   addrBreak<0 );.
af10: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61 62    if( pSort->lab
af20: 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20 73  elBkOut ){.    s
af30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
af40: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
af50: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
af60: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
af70: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
af80: 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 42  dbeGoto(v, addrB
af90: 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  reak);.    sqlit
afa0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
afb0: 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c 61 62  el(v, pSort->lab
afc0: 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  elBkOut);.  }.  
afd0: 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69 45  iTab = pSort->iE
afe0: 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65 44  Cursor;.  if( eD
aff0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
b000: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
b010: 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73 74  routine || eDest
b020: 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20 20  ==SRT_Mem ){.   
b030: 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20   regRowid = 0;. 
b040: 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65 73     regRow = pDes
b050: 74 2d 3e 69 53 64 73 74 3b 0a 20 20 20 20 6e 53  t->iSdst;.    nS
b060: 6f 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d  ortData = nColum
b070: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
b080: 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  regRowid = sqlit
b090: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
b0a0: 72 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77  rse);.    regRow
b0b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
b0c0: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
b0d0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f  Column);.    nSo
b0e0: 72 74 44 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e  rtData = nColumn
b0f0: 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70  ;.  }.  nKey = p
b100: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d  OrderBy->nExpr -
b110: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a   pSort->nOBSat;.
b120: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
b130: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
b140: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
b150: 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75     int regSortOu
b160: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
b170: 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62  em;.    iSortTab
b180: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
b190: 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74  +;.    if( pSort
b1a0: 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a  ->labelBkOut ){.
b1b0: 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d        addrOnce =
b1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b1d0: 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20  p0(v, OP_Once); 
b1e0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
b1f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
b200: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b210: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69  OP_OpenPseudo, i
b220: 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74  SortTab, regSort
b230: 4f 75 74 2c 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72  Out, nKey+1+nSor
b240: 74 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  tData);.    if( 
b250: 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74  addrOnce ) sqlit
b260: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
b270: 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20  , addrOnce);.   
b280: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
b290: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
b2a0: 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
b2b0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
b2c0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
b2d0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
b2e0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
b2f0: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
b300: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
b310: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b320: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
b330: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53  , regSortOut, iS
b340: 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65  ortTab);.    bSe
b350: 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q = 0;.  }else{.
b360: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
b370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b380: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
b390: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  b, addrBreak); V
b3a0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
b3b0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
b3c0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
b3d0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
b3e0: 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62   iSortTab = iTab
b3f0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a  ;.    bSeq = 1;.
b400: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69    }.  for(i=0, i
b410: 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71 3b 20 69  Col=nKey+bSeq; i
b420: 3c 6e 53 6f 72 74 44 61 74 61 3b 20 69 2b 2b 29  <nSortData; i++)
b430: 7b 0a 20 20 20 20 69 6e 74 20 69 52 65 61 64 3b  {.    int iRead;
b440: 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45 78 5b  .    if( aOutEx[
b450: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
b460: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 52 65 61  ol ){.      iRea
b470: 64 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e  d = aOutEx[i].u.
b480: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b  x.iOrderByCol-1;
b490: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b4a0: 20 20 69 52 65 61 64 20 3d 20 69 43 6f 6c 2b 2b    iRead = iCol++
b4b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b4c0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b4d0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
b4e0: 74 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67  tTab, iRead, reg
b4f0: 52 6f 77 2b 69 29 3b 0a 20 20 20 20 56 64 62 65  Row+i);.    Vdbe
b500: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
b510: 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d  , aOutEx[i].zNam
b520: 65 20 3f 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  e ? aOutEx[i].zN
b530: 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e  ame : aOutEx[i].
b540: 7a 53 70 61 6e 29 29 3b 0a 20 20 7d 0a 20 20 73  zSpan));.  }.  s
b550: 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a  witch( eDest ){.
b560: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
b570: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
b580: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
b590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b5a0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
b5b0: 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  wid, iParm, regR
b5c0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
b5d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
b5e0: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
b5f0: 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52  rm, regRow, regR
b600: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  owid);.      sql
b610: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
b620: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
b630: 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  D);.      break;
b640: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
b650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
b660: 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54  ERY.    case SRT
b670: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Set: {.      as
b680: 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73  sert( nColumn==s
b690: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
b6a0: 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 29 20  Dest->zAffSdst) 
b6b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b6c0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
b6d0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
b6e0: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65  Row, nColumn, re
b6f0: 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  gRowid,.        
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
b720: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
b730: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
b740: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
b750: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
b760: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
b770: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b780: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
b790: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
b7a0: 52 6f 77 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e  Rowid, regRow, n
b7b0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62  Column);.      b
b7c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b7d0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
b7e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
b7f0: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
b800: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
b810: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
b820: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b830: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
b840: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
b850: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
b860: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
b870: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
b880: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
b890: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
b8a0: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
b8b0: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
b8c0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
b8d0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
b8e0: 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
b8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b900: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
b910: 75 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69  ultRow, pDest->i
b920: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
b930: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b940: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
b950: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
b960: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
b970: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
b980: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b990: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
b9a0: 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
b9b0: 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
b9c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b9d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b9e0: 20 72 65 67 52 6f 77 69 64 20 29 7b 0a 20 20 20   regRowid ){.   
b9f0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
ba00: 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Set ){.      sql
ba10: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ba20: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
ba30: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Row, nColumn);. 
ba40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ba50: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
ba60: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
ba70: 67 52 6f 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gRow);.    }.   
ba80: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ba90: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
baa0: 65 67 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  egRowid);.  }.  
bab0: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
bac0: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
bad0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
bae0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
baf0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
bb00: 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67   pSort->sortFlag
bb10: 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65  s & SORTFLAG_Use
bb20: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
bb30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
bb40: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
bb50: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56  , iTab, addr); V
bb60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
bb70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
bb80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
bb90: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
bba0: 20 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65   addr); VdbeCove
bbb0: 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69  rage(v);.  }.  i
bbc0: 66 28 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  f( pSort->regRet
bbd0: 75 72 6e 20 29 20 73 71 6c 69 74 65 33 56 64 62  urn ) sqlite3Vdb
bbe0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
bbf0: 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67  turn, pSort->reg
bc00: 52 65 74 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74  Return);.  sqlit
bc10: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
bc20: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
bc30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
bc40: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
bc50: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
bc60: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
bc70: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
bc80: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
bc90: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
bca0: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
bcb0: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
bcc0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
bcd0: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
bce0: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
bcf0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
bd00: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
bd10: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
bd20: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
bd30: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
bd40: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
bd50: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
bd60: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
bd70: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
bd80: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
bd90: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
bda0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bdb0: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
bdc0: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
bdd0: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
bde0: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
bdf0: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
be00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
be10: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
be20: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
be30: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
be40: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
be50: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
be60: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
be70: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
be80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
be90: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
bea0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
beb0: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
bec0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
bed0: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
bee0: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
bef0: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
bf00: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
bf10: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
bf20: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
bf30: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
bf40: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
bf50: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
bf60: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
bf70: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
bf80: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
bf90: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
bfa0: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
bfb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
bfc0: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
bfd0: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
bfe0: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
bff0: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
c000: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c010: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
c020: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
c030: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
c040: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c050: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c060: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
c070: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
c080: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
c090: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 23 65  (A,B,C,D,E,F).#e
c0a0: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
c0b0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c0c0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
c0d0: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
c0e0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
c0f0: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
c100: 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 23 65 6e 64  Impl(A,B,F).#end
c110: 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  if.static const 
c120: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
c130: 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Impl(.  NameCont
c140: 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70  ext *pNC, .  Exp
c150: 72 20 2a 70 45 78 70 72 2c 0a 23 69 66 64 65 66  r *pExpr,.#ifdef
c160: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
c170: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
c180: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
c190: 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20  OrigDb,.  const 
c1a0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62  char **pzOrigTab
c1b0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
c1c0: 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 23 65 6e 64  *pzOrigCol,.#end
c1d0: 69 66 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  if.  u8 *pEstWid
c1e0: 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  th.){.  char con
c1f0: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
c200: 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74   int j;.  u8 est
c210: 57 69 64 74 68 20 3d 20 31 3b 0a 23 69 66 64 65  Width = 1;.#ifde
c220: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c230: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
c240: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
c250: 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61  rigDb = 0;.  cha
c260: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61  r const *zOrigTa
c270: 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  b = 0;.  char co
c280: 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  nst *zOrigCol = 
c290: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
c2a0: 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b  ert( pExpr!=0 );
c2b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e  .  assert( pNC->
c2c0: 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20  pSrcList!=0 );. 
c2d0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
c2e0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
c2f0: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
c300: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
c310: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
c320: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
c330: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
c340: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
c350: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
c360: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
c370: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
c380: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
c390: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
c3a0: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
c3b0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
c3c0: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
c3d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
c3e0: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
c3f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
c400: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
c410: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
c420: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
c430: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
c440: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
c450: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
c460: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c470: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
c480: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
c490: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
c4a0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
c4b0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
c4c0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
c4d0: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
c4e0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c4f0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
c500: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
c510: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
c520: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
c530: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
c540: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
c550: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
c560: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
c570: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
c580: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
c590: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
c5a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
c5b0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
c5c0: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
c5d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
c5e0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
c5f0: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
c600: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
c610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c620: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
c630: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
c640: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c650: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
c660: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
c670: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
c680: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
c690: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
c6a0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
c6b0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
c6c0: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
c6d0: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
c6e0: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
c6f0: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
c700: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
c710: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
c720: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
c730: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
c740: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
c750: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
c760: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
c770: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
c780: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
c790: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
c7a0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
c7b0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
c7c0: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
c7d0: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
c7e0: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
c7f0: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
c800: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
c810: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
c820: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
c830: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
c840: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
c850: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
c860: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
c870: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
c880: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
c890: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
c8a0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
c8b0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
c8c0: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
c8d0: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
c8e0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
c8f0: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
c900: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
c910: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
c920: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
c930: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
c940: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
c950: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
c960: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
c970: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
c980: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
c990: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
c9a0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
c9b0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
c9c0: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
c9d0: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
c9e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
c9f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
ca00: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
ca10: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
ca20: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
ca30: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
ca40: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
ca50: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
ca60: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
ca70: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
ca80: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
ca90: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
caa0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
cab0: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
cac0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
cad0: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
cae0: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
caf0: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
cb00: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
cb10: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
cb20: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
cb30: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
cb40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
cb50: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
cb60: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
cb70: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
cb80: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
cb90: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
cba0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
cbb0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
cbc0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
cbd0: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
cbe0: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
cbf0: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
cc00: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
cc10: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
cc20: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
cc30: 20 2a 2a 20 54 68 65 20 41 4c 57 41 59 53 28 29   ** The ALWAYS()
cc40: 20 69 73 20 62 65 63 61 75 73 65 20 69 43 6f 6c   is because iCol
cc50: 3e 3d 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  >=pS->pEList->nE
cc60: 78 70 72 20 77 69 6c 6c 20 68 61 76 65 20 62 65  xpr will have be
cc70: 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  en.          ** 
cc80: 63 61 75 67 68 74 20 61 6c 72 65 61 64 79 20 62  caught already b
cc90: 79 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  y name resolutio
cca0: 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  n..          */.
ccb0: 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f            NameCo
ccc0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
ccd0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
cce0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  S->pEList->a[iCo
ccf0: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  l].pExpr;.      
cd00: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
cd10: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
cd20: 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74         sNC.pNext
cd30: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20   = pNC;.        
cd40: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
cd50: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
cd60: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f        zType = co
cd70: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
cd80: 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67  ,&zOrigDb,&zOrig
cd90: 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  Tab,&zOrigCol, &
cda0: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
cdb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
cdc0: 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68  e if( pTab->pSch
cdd0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ema ){.        /
cde0: 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a  * A real table *
cdf0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
ce00: 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20  ( !pS );.       
ce10: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
ce20: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
ce30: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ce40: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
ce50: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
ce60: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69  Tab->nCol) );.#i
ce70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ce80: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
ce90: 54 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  TA.        if( i
cea0: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
ceb0: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
cec0: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20  GER";.          
ced0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69  zOrigCol = "rowi
cee0: 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d";.        }els
cef0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  e{.          zOr
cf00: 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43  igCol = pTab->aC
cf10: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
cf20: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
cf30: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
cf40: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
cf50: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
cf60: 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70      estWidth = p
cf70: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
cf80: 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  szEst;.        }
cf90: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61  .        zOrigTa
cfa0: 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  b = pTab->zName;
cfb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
cfc0: 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  ->pParse ){.    
cfd0: 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
cfe0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
cff0: 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65  ndex(pNC->pParse
d000: 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
d010: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
d020: 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70  zOrigDb = pNC->p
d030: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
d040: 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  Db].zDbSName;.  
d050: 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
d060: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
d070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
d080: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
d090: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
d0a0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
d0b0: 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
d0c0: 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  ype(&pTab->aCol[
d0d0: 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20  iCol],0);.      
d0e0: 20 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70      estWidth = p
d0f0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
d100: 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  szEst;.        }
d110: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
d120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d130: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
d140: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
d150: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
d160: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
d170: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d180: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52   a sub-select. R
d190: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
d1a0: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20  ation type and. 
d1b0: 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69       ** origin i
d1c0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67  nfo for the sing
d1d0: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  le column in the
d1e0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d1f0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20  he SELECT.      
d200: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ** statement..  
d210: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d      */.      Nam
d220: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
d230: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d      Select *pS =
d240: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
d250: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
d260: 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61   = pS->pEList->a
d270: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
d280: 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73   assert( ExprHas
d290: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
d2a0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
d2b0: 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  .      sNC.pSrcL
d2c0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
d2d0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
d2e0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43  = pNC;.      sNC
d2f0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
d300: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79  Parse;.      zTy
d310: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d320: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
d330: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
d340: 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64  OrigCol, &estWid
d350: 74 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  th); .      brea
d360: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
d370: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
d380: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
d390: 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66  _METADATA  .  if
d3a0: 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20  ( pzOrigDb ){.  
d3b0: 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67    assert( pzOrig
d3c0: 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c  Tab && pzOrigCol
d3d0: 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44   );.    *pzOrigD
d3e0: 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20  b = zOrigDb;.   
d3f0: 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f   *pzOrigTab = zO
d400: 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f  rigTab;.    *pzO
d410: 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f  rigCol = zOrigCo
d420: 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  l;.  }.#endif.  
d430: 69 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20  if( pEstWidth ) 
d440: 2a 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74  *pEstWidth = est
d450: 57 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20  Width;.  return 
d460: 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zType;.}../*.** 
d470: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
d480: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
d490: 20 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72   VDBE the declar
d4a0: 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63  ation types of c
d4b0: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
d4c0: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a   result set..*/.
d4d0: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
d4e0: 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
d4f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d500: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
d510: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
d520: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
d530: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
d540: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
d550: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
d560: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
d570: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
d580: 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  set */.){.#ifnde
d590: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
d5a0: 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76  CLTYPE.  Vdbe *v
d5b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d5c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d  ;.  int i;.  Nam
d5d0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
d5e0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
d5f0: 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70  TabList;.  sNC.p
d600: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
d610: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
d620: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
d630: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
d640: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
d650: 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  pr;.    const ch
d660: 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65  ar *zType;.#ifde
d670: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
d680: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
d690: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
d6a0: 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20  zOrigDb = 0;.   
d6b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d6c0: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63  igTab = 0;.    c
d6d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
d6e0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79  Col = 0;.    zTy
d6f0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
d700: 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44  &sNC, p, &zOrigD
d710: 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a  b, &zOrigTab, &z
d720: 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20  OrigCol, 0);..  
d730: 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75    /* The vdbe mu
d740: 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20  st make its own 
d750: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75  copy of the colu
d760: 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65  mn-type and othe
d770: 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  r .    ** column
d780: 20 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67   specific string
d790: 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  s, in case the s
d7a0: 63 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62  chema is reset b
d7b0: 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a  efore this.    *
d7c0: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
d7d0: 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  e is deleted..  
d7e0: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
d7f0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
d800: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54  , i, COLNAME_DAT
d810: 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20  ABASE, zOrigDb, 
d820: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d830: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d840: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d850: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45  i, COLNAME_TABLE
d860: 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49  , zOrigTab, SQLI
d870: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
d890: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
d8a0: 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a  OLNAME_COLUMN, z
d8b0: 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  OrigCol, SQLITE_
d8c0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73  TRANSIENT);.#els
d8d0: 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  e.    zType = co
d8e0: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d8f0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  , 0, 0, 0, 0);.#
d900: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
d910: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
d920: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45  v, i, COLNAME_DE
d930: 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53  CLTYPE, zType, S
d940: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
d950: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
d960: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d970: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a  OMIT_DECLTYPE) *
d980: 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  /.}../*.** Gener
d990: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
d9a0: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
d9b0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
d9c0: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
d9d0: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69  result set.  Thi
d9e0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
d9f0: 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65   used to provide
da00: 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20   the.** azCol[] 
da10: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61  values in the ca
da20: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
da30: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
da40: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61  olumnNames(.  Pa
da50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
da60: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
da70: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
da80: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
da90: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
daa0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
dab0: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
dac0: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
dad0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
dae0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
daf0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
db00: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71    int i, j;.  sq
db10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
db20: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75  se->db;.  int fu
db30: 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61  llNames, shortNa
db40: 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  mes;..#ifndef SQ
db50: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
db60: 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
db70: 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
db80: 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
db90: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
dba0: 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
dbb0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
dbc0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
dbd0: 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 64 62  olNamesSet || db
dbe0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
dbf0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
dc00: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
dc10: 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d 30  ert( pTabList!=0
dc20: 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   );.  pParse->co
dc30: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
dc40: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
dc50: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
dc60: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
dc70: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
dc80: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
dc90: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
dca0: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
dcb0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
dcc0: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
dcd0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
dce0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
dcf0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
dd00: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
dd10: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
dd20: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
dd30: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
dd40: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
dd50: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
dd60: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
dd70: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
dd80: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
dd90: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
dda0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
ddb0: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
ddc0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
ddd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
dde0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op==TK_COLUMN ||
ddf0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43   p->op==TK_AGG_C
de00: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 54  OLUMN ){.      T
de10: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
de20: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20    char *zCol;.  
de30: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
de40: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
de50: 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53   for(j=0; ALWAYS
de60: 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  (j<pTabList->nSr
de70: 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  c); j++){.      
de80: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
de90: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d  a[j].iCursor==p-
dea0: 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b  >iTable ) break;
deb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
dec0: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
ded0: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
dee0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
def0: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
df00: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
df10: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
df20: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
df30: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
df40: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
df50: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
df60: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
df70: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
df80: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
df90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
dfa0: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
dfb0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
dfc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
dfd0: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
dfe0: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
dff0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e000: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
e010: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
e020: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e030: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
e040: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
e050: 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  an), SQLITE_DYNA
e060: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
e070: 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20  e if( fullNames 
e080: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
e090: 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  *zName = 0;.    
e0a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
e0b0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e0c0: 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
e0d0: 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  ame, zCol);.    
e0e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e0f0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
e100: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
e110: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  ame, SQLITE_DYNA
e120: 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  MIC);.      }els
e130: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
e140: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
e150: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
e160: 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54  AME, zCol, SQLIT
e170: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
e180: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e190: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
e1a0: 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *z = pEList->a
e1b0: 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [i].zSpan;.     
e1c0: 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69   z = z==0 ? sqli
e1d0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
e1e0: 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20  column%d", i+1) 
e1f0: 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  : sqlite3DbStrDu
e200: 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  p(db, z);.      
e210: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
e220: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
e230: 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c  AME_NAME, z, SQL
e240: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
e250: 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61    }.  }.  genera
e260: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50  teColumnTypes(pP
e270: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
e280: 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pEList);.}../*.*
e290: 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65  * Given an expre
e2a0: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
e2b0: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
e2c0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
e2d0: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
e2e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
e2f0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
e300: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
e310: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
e320: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
e330: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
e340: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
e350: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
e360: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
e370: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
e380: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
e390: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
e3a0: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
e3b0: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
e3c0: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
e3d0: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
e3e0: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
e3f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
e400: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e410: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
e420: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
e430: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
e440: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
e450: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
e460: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
e470: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
e480: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75  .int sqlite3Colu
e490: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
e4a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e4b0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
e4c0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
e4d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
e4e0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
e4f0: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
e500: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
e510: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
e520: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
e530: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
e540: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
e550: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
e560: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
e570: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
e580: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
e590: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
e5a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e5b0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
e5c0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
e5d0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
e5e0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
e5f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e600: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20  unters */.  u32 
e610: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
e620: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
e630: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
e640: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
e650: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
e660: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
e670: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
e680: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
e690: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
e6a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e6b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e6c0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
e6d0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
e6e0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e700: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
e710: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
e720: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
e730: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
e740: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
e750: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
e760: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
e770: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e780: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
e790: 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
e7c0: 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
e7d0: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
e7e0: 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
e7f0: 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
e800: 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
e810: 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
e820: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
e830: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
e840: 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
e850: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
e860: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  ol==0 );.  }else
e870: 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a  {.    nCol = 0;.
e880: 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20      aCol = 0;.  
e890: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  }.  assert( nCol
e8a0: 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20  ==(i16)nCol );. 
e8b0: 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a   *pnCol = nCol;.
e8c0: 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b    *paCol = aCol;
e8d0: 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ..  for(i=0, pCo
e8e0: 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26  l=aCol; i<nCol &
e8f0: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
e900: 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  led; i++, pCol++
e910: 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
e920: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
e930: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
e940: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
e950: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
e960: 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
e970: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
e980: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
e990: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
e9a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
e9b0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
e9c0: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
e9d0: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
e9e0: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
e9f0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  name */.    }els
ea00: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
ea10: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
ea20: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
ea30: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
ea40: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
ea50: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
ea60: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
ea70: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
ea80: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
ea90: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
eaa0: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
eab0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
eac0: 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d        pColExpr =
ead0: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
eae0: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
eaf0: 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29  t( pColExpr!=0 )
eb00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
eb10: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
eb20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  ==TK_COLUMN && A
eb30: 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e  LWAYS(pColExpr->
eb40: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
eb50: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
eb60: 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
eb70: 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
eb80: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
eb90: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c  = pColExpr->iCol
eba0: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  umn;.        pTa
ebb0: 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
ebc0: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ab;.        if( 
ebd0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
ebe0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
ebf0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f       zName = iCo
ec00: 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f  l>=0 ? pTab->aCo
ec10: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20  l[iCol].zName : 
ec20: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d  "rowid";.      }
ec30: 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70  else if( pColExp
ec40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  r->op==TK_ID ){.
ec50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ec60: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
ec70: 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e  (pColExpr, EP_In
ec80: 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
ec90: 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45     zName = pColE
eca0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
ecb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ecc0: 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f      /* Use the o
ecd0: 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20  riginal text of 
ece0: 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  the column expre
ecf0: 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d  ssion as its nam
ed00: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61  e */.        zNa
ed10: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
ed20: 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d  ].zSpan;.      }
ed30: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
ed40: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
ed50: 66 28 64 62 2c 20 22 25 73 22 2c 20 7a 4e 61 6d  f(db, "%s", zNam
ed60: 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  e);..    /* Make
ed70: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
ed80: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
ed90: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
eda0: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
edb0: 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e   ** append an in
edc0: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
edd0: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
ede0: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
edf0: 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   */.    cnt = 0;
ee00: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d  .    while( zNam
ee10: 65 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68  e && sqlite3Hash
ee20: 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29  Find(&ht, zName)
ee30: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61  !=0 ){.      nNa
ee40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
ee50: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
ee60: 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29     if( nName>0 )
ee70: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
ee80: 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20  nName-1; j>0 && 
ee90: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
eea0: 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d  Name[j]); j--){}
eeb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
eec0: 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61  me[j]==':' ) nNa
eed0: 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a  me = j;.      }.
eee0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
eef0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
ef00: 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d   "%.*z:%u", nNam
ef10: 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29  e, zName, ++cnt)
ef20: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e  ;.      if( cnt>
ef30: 33 20 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  3 ) sqlite3_rand
ef40: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e  omness(sizeof(cn
ef50: 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d  t), &cnt);.    }
ef60: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
ef70: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71   = zName;.    sq
ef80: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
ef90: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c  rtiesFromName(0,
efa0: 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20   pCol);.    if( 
efb0: 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  zName && sqlite3
efc0: 48 61 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20  HashInsert(&ht, 
efd0: 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43  zName, pCol)==pC
efe0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
eff0: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
f000: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
f010: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 68  ite3HashClear(&h
f020: 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  t);.  if( db->ma
f030: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
f040: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
f050: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
f060: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
f070: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
f080: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
f090: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
f0a0: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
f0b0: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
f0c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f0d0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
f0e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
f0f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f100: 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  Add type and col
f110: 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
f120: 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c  on to a column l
f130: 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ist based on.** 
f140: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
f150: 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63  nt..** .** The c
f160: 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75  olumn list presu
f170: 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20  mably came from 
f180: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65  selectColumnName
f190: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e  sFromExprList().
f1a0: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
f1b0: 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d  ist has only nam
f1c0: 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72  es, not types or
f1d0: 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68   collations.  Th
f1e0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f  is.** routine go
f1f0: 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61  es through and a
f200: 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61 6e  dds the types an
f210: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a  d collations..**
f220: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f230: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 61   requires that a
f240: 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  ll identifiers i
f250: 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20  n the SELECT.** 
f260: 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73  statement be res
f270: 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olved..*/.void s
f280: 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43  qlite3SelectAddC
f290: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
f2a0: 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  ation(.  Parse *
f2b0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
f2c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
f2d0: 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ts */.  Table *p
f2e0: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Tab,          /*
f2f0: 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65   Add column type
f300: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
f310: 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20  this table */.  
f320: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
f330: 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20        /* SELECT 
f340: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
f350: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
f360: 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73  ations */.){.  s
f370: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
f380: 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43  rse->db;.  NameC
f390: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f  ontext sNC;.  Co
f3a0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f  lumn *pCol;.  Co
f3b0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
f3c0: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70  int i;.  Expr *p
f3d0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
f3e0: 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75  ist_item *a;.  u
f3f0: 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20  64 szAll = 0;.. 
f400: 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74   assert( pSelect
f410: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
f420: 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c   (pSelect->selFl
f430: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
f440: 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  d)!=0 );.  asser
f450: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70  t( pTab->nCol==p
f460: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
f470: 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  nExpr || db->mal
f480: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
f490: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f4a0: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
f4b0: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
f4c0: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
f4d0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
f4e0: 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
f4f0: 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  a = pSelect->pEL
f500: 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  ist->a;.  for(i=
f510: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
f520: 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; i<pTab->nCol
f530: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
f540: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f550: 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e  zType;.    int n
f560: 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69  , m;.    p = a[i
f570: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a 54 79  ].pExpr;.    zTy
f580: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
f590: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
f5a0: 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b  , &pCol->szEst);
f5b0: 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43  .    szAll += pC
f5c0: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70  ol->szEst;.    p
f5d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
f5e0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
f5f0: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
f600: 7a 54 79 70 65 20 26 26 20 28 6d 20 3d 20 73 71  zType && (m = sq
f610: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
f620: 79 70 65 29 29 3e 30 20 29 7b 0a 20 20 20 20 20  ype))>0 ){.     
f630: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
f640: 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  en30(pCol->zName
f650: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  );.      pCol->z
f660: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
f670: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62  ReallocOrFree(db
f680: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pCol->zName, n
f690: 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28  +m+2);.      if(
f6a0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a   pCol->zName ){.
f6b0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
f6c0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d  pCol->zName[n+1]
f6d0: 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20  , zType, m+1);. 
f6e0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c         pCol->col
f6f0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
f700: 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20  _HASTYPE;.      
f710: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
f720: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
f730: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
f740: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
f750: 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  BLOB;.    pColl 
f760: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
f770: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
f780: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  .    if( pColl &
f790: 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30  & pCol->zColl==0
f7a0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e   ){.      pCol->
f7b0: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44  zColl = sqlite3D
f7c0: 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c  bStrDup(db, pCol
f7d0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  l->zName);.    }
f7e0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54  .  }.  pTab->szT
f7f0: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
f800: 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a  ogEst(szAll*4);.
f810: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
f820: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f830: 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
f840: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
f850: 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
f860: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
f870: 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
f880: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
f890: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
f8a0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
f8b0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
f8c0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
f8d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
f8e0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
f8f0: 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
f900: 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
f910: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
f920: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
f930: 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
f940: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
f950: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
f960: 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
f970: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
f980: 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
f990: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
f9a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
f9b0: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
f9c0: 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
f9d0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
f9e0: 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
f9f0: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
fa00: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
fa10: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
fa20: 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
fa30: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
fa40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fa50: 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
fa60: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
fa70: 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
fa80: 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
fa90: 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
faa0: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
fab0: 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
fac0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
fad0: 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  le );.  pTab->nT
fae0: 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  abRef = 1;.  pTa
faf0: 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
fb00: 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
fb10: 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
fb20: 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
fb30: 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
fb40: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
fb50: 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
fb60: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
fb70: 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
fb80: 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
fb90: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
fba0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
fbb0: 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
fbc0: 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
fbd0: 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
fbe0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
fbf0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
fc00: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
fc10: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
fc20: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
fc30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
fc40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
fc50: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
fc60: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
fc70: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
fc80: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
fc90: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
fca0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fcb0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
fcc0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
fcd0: 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arse..*/.static 
fce0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
fcf0: 56 64 62 65 20 2a 61 6c 6c 6f 63 56 64 62 65 28  Vdbe *allocVdbe(
fd00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
fd10: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
fd20: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
fd30: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
fd40: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
fd50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fd60: 70 32 28 76 2c 20 4f 50 5f 49 6e 69 74 2c 20 30  p2(v, OP_Init, 0
fd70: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 1);.  if( pPar
fd80: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
fd90: 0a 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74  .   && Optimizat
fda0: 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61 72 73  ionEnabled(pPars
fdb0: 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46 61 63  e->db,SQLITE_Fac
fdc0: 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29  torOutConst).  )
fdd0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b  {.    pParse->ok
fde0: 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31 3b  ConstFactor = 1;
fdf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
fe00: 0a 7d 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  .}.Vdbe *sqlite3
fe10: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
fe20: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
fe30: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
fe40: 65 3b 0a 20 20 72 65 74 75 72 6e 20 76 20 3f 20  e;.  return v ? 
fe50: 76 20 3a 20 61 6c 6c 6f 63 56 64 62 65 28 70 50  v : allocVdbe(pP
fe60: 61 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  arse);.}.../*.**
fe70: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69   Compute the iLi
fe80: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
fe90: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45  fields of the SE
fea0: 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68  LECT based on th
feb0: 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20  e.** pLimit and 
fec0: 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69  pOffset expressi
fed0: 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64  ons.  pLimit and
fee0: 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68   pOffset hold th
fef0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  e expressions.**
ff00: 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
ff10: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
ff20: 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72   statement after
ff30: 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
ff40: 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64  FFSET.** keyword
ff50: 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74  s.  Or NULL if t
ff60: 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72  hose keywords ar
ff70: 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69  e omitted. iLimi
ff80: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a  t and iOffset .*
ff90: 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65  * are the intege
ffa0: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  r memory registe
ffb0: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f  r numbers for co
ffc0: 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63  unters used to c
ffd0: 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c  ompute .** the l
ffe0: 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e  imit and offset.
fff0: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
10000 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66   limit and/or of
10010 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69  fset, then .** i
10020 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
10030 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a  t are negative..
10040 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
10050 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76  ne changes the v
10060 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20  alues of iLimit 
10070 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79  and iOffset only
10080 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f   if.** a limit o
10090 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69  r offset is defi
100a0 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e  ned by pLimit an
100b0 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d  d pOffset.  iLim
100c0 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65  it and.** iOffse
100d0 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  t should have be
100e0 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70  en preset to app
100f0 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74  ropriate default
10100 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a   values (zero).*
10110 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  * prior to calli
10120 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
10130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73  .**.** The iOffs
10140 65 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20  et register (if 
10150 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e  it exists) is in
10160 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
10170 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
10180 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c   OFFSET.  The iL
10190 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73  imit register is
101a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
101b0 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72  LIMIT.  Register
101c0 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73  .** iOffset+1 is
101d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
101e0 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a  LIMIT+OFFSET..**
101f0 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
10200 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
10210 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
10220 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
10230 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
10240 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
10250 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
10260 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
10270 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
10280 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
10290 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
102a0 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
102b0 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
102c0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
102d0 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
102e0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
102f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
10300 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
10310 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
10320 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
10330 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
10340 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ffset;.  int n;.
10350 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
10360 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
10370 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
10380 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
10390 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
103a0 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
103b0 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
103c0 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
103d0 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
103e0 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
103f0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
10400 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
10410 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
10420 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
10430 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
10440 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
10450 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  e);.  assert( p-
10460 3e 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >pOffset==0 || p
10470 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20  ->pLimit!=0 );. 
10480 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
10490 7b 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20  {.    p->iLimit 
104a0 3d 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61  = iLimit = ++pPa
104b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76  rse->nMem;.    v
104c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
104d0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61  e(pParse);.    a
104e0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
104f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
10500 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
10510 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
10520 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10530 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
10540 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
10550 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
10560 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
10570 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
10580 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
10590 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
105a0 6f 74 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  oto(v, iBreak);.
105b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
105c0 6e 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65  n>=0 && p->nSele
105d0 63 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67  ctRow>sqlite3Log
105e0 45 73 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20  Est((u64)n) ){. 
105f0 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
10600 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
10610 67 45 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20  gEst((u64)n);.  
10620 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
10630 73 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d  s |= SF_FixedLim
10640 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
10650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
10660 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
10670 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
10680 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
10690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
106a0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
106b0 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  , iLimit); VdbeC
106c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
106d0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
106e0 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
106f0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
10700 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10710 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74  OP_IfNot, iLimit
10720 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
10730 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10740 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66  }.    if( p->pOf
10750 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  fset ){.      p-
10760 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
10770 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
10780 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
10790 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
107a0 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
107b0 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
107c0 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
107d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
107e0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e  Code(pParse, p->
107f0 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74  pOffset, iOffset
10800 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10810 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
10820 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66  _MustBeInt, iOff
10830 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  set); VdbeCovera
10840 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
10850 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46  eComment((v, "OF
10860 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  FSET counter"));
10870 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10880 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
10890 66 66 73 65 74 4c 69 6d 69 74 2c 20 69 4c 69 6d  ffsetLimit, iLim
108a0 69 74 2c 20 69 4f 66 66 73 65 74 2b 31 2c 20 69  it, iOffset+1, i
108b0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56  Offset);.      V
108c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
108d0 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b  LIMIT+OFFSET"));
108e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69  .    }.  }.}..#i
108f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10900 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
10910 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T./*.** Return t
10920 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 63  he appropriate c
10930 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
10940 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  e for the iCol-t
10950 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74  h column of.** t
10960 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66 6f  he result set fo
10970 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73  r the compound-s
10980 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
10990 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  "p".  Return NUL
109a0 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  L if.** the colu
109b0 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75 6c  mn has no defaul
109c0 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
109d0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ence..**.** The 
109e0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
109f0 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  ce for the compo
10a00 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74 61  und select is ta
10a10 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ken from the.** 
10a20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f  left-most term o
10a30 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68 61  f the select tha
10a40 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  t has a collatin
10a50 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  g sequence..*/.s
10a60 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d  tatic CollSeq *m
10a70 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
10a80 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
10a90 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10aa0 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  iCol){.  CollSeq
10ab0 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70 2d   *pRet;.  if( p-
10ac0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
10ad0 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  Ret = multiSelec
10ae0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
10af0 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c   p->pPrior, iCol
10b00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10b10 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
10b20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
10b30 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c 20 6d 75 73  );.  /* iCol mus
10b40 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 70  t be less than p
10b50 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2e  ->pEList->nExpr.
10b60 20 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 65    Otherwise an e
10b70 72 72 6f 72 20 77 6f 75 6c 64 0a 20 20 2a 2a 20  rror would.  ** 
10b80 68 61 76 65 20 62 65 65 6e 20 74 68 72 6f 77 6e  have been thrown
10b90 20 64 75 72 69 6e 67 20 6e 61 6d 65 20 72 65 73   during name res
10ba0 6f 6c 75 74 69 6f 6e 20 61 6e 64 20 77 65 20 77  olution and we w
10bb0 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 67 6f  ould not have go
10bc0 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 66  tten.  ** this f
10bd0 61 72 20 2a 2f 0a 20 20 69 66 28 20 70 52 65 74  ar */.  if( pRet
10be0 3d 3d 30 20 26 26 20 41 4c 57 41 59 53 28 69 43  ==0 && ALWAYS(iC
10bf0 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ol<p->pEList->nE
10c00 78 70 72 29 20 29 7b 0a 20 20 20 20 70 52 65 74  xpr) ){.    pRet
10c10 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
10c20 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
10c30 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
10c40 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
10c50 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
10c60 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
10c70 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
10c80 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
10c90 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f  arameter is a co
10ca0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a  mpound SELECT.**
10cb0 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
10cc0 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66  Y clause. This f
10cd0 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
10ce0 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
10cf0 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  KeyInfo.** struc
10d00 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f  ture suitable fo
10d10 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  r implementing t
10d20 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a  he ORDER BY..**.
10d30 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
10d40 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
10d50 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
10d60 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
10d70 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
10d80 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
10d90 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72  nsible for ensur
10da0 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
10db0 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
10dc0 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
10dd0 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
10de0 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  o *multiSelectOr
10df0 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72  derByKeyInfo(Par
10e00 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
10e10 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72  ct *p, int nExtr
10e20 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  a){.  ExprList *
10e30 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
10e40 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f  rderBy;.  int nO
10e50 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
10e60 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73  erBy->nExpr;.  s
10e70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10e80 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e  rse->db;.  KeyIn
10e90 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  fo *pRet = sqlit
10ea0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
10eb0 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74  b, nOrderBy+nExt
10ec0 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52  ra, 1);.  if( pR
10ed0 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
10ee0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10ef0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
10f00 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
10f10 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
10f20 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61  m = &pOrderBy->a
10f30 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20  [i];.      Expr 
10f40 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e  *pTerm = pItem->
10f50 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c  pExpr;.      Col
10f60 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
10f70 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
10f80 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
10f90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  e ){.        pCo
10fa0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
10fb0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10fc0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  pTerm);.      }e
10fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
10fe0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
10ff0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
11000 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  p, pItem->u.x.iO
11010 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20  rderByCol-1);.  
11020 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
11030 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  =0 ) pColl = db-
11040 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
11050 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
11060 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20  i].pExpr =.     
11070 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11080 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
11090 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
110a0 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
110b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
110c0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
110d0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
110e0 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52  Ret) );.      pR
110f0 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  et->aColl[i] = p
11100 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74  Coll;.      pRet
11110 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
11120 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
11130 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
11140 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
11150 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
11160 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
11170 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11180 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44  ine generates VD
11190 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  BE code to compu
111a0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  te the content o
111b0 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49  f a WITH RECURSI
111c0 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74  VE.** query of t
111d0 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
111e0 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c   <recursive-tabl
111f0 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75  e> AS (<setup-qu
11200 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  ery> UNION [ALL]
11210 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72   <recursive-quer
11220 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  y>).**          
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
11240 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
11250 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
11260 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
11290 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
112a0 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a         p.**.**.*
112b0 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  * There is exact
112c0 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  ly one reference
112d0 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76   to the recursiv
112e0 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e-table in the F
112f0 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66  ROM clause.** of
11300 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
11310 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68  , marked with th
11320 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 66  e SrcList->a[].f
11330 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 66 6c  g.isRecursive fl
11340 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  ag..**.** The se
11350 74 75 70 2d 71 75 65 72 79 20 72 75 6e 73 20 6f  tup-query runs o
11360 6e 63 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20  nce to generate 
11370 61 6e 20 69 6e 69 74 69 61 6c 20 73 65 74 20 6f  an initial set o
11380 66 20 72 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a  f rows that go.*
11390 2a 20 69 6e 74 6f 20 61 20 51 75 65 75 65 20 74  * into a Queue t
113a0 61 62 6c 65 2e 20 20 52 6f 77 73 20 61 72 65 20  able.  Rows are 
113b0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
113c0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 6f  he Queue table o
113d0 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45  ne by.** one.  E
113e0 61 63 68 20 72 6f 77 20 65 78 74 72 61 63 74 65  ach row extracte
113f0 64 20 66 72 6f 6d 20 51 75 65 75 65 20 69 73 20  d from Queue is 
11400 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
11410 20 20 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c    Then the singl
11420 65 0a 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72  e.** extracted r
11430 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68 65 20 69  ow (now in the i
11440 43 75 72 72 65 6e 74 20 74 61 62 6c 65 29 20 62  Current table) b
11450 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6e 74 65  ecomes the conte
11460 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63  nt of the.** rec
11470 75 72 73 69 76 65 2d 74 61 62 6c 65 20 66 6f 72  ursive-table for
11480 20 61 20 72 65 63 75 72 73 69 76 65 2d 71 75 65   a recursive-que
11490 72 79 20 72 75 6e 2e 20 20 54 68 65 20 6f 75 74  ry run.  The out
114a0 70 75 74 20 6f 66 20 74 68 65 20 72 65 63 75 72  put of the recur
114b0 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73  sive-query.** is
114c0 20 61 64 64 65 64 20 62 61 63 6b 20 69 6e 74 6f   added back into
114d0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
114e0 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68 65 72 20  .  Then another 
114f0 72 6f 77 20 69 73 20 65 78 74 72 61 63 74 65 64  row is extracted
11500 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61   from Queue.** a
11510 6e 64 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e  nd the iteration
11520 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c   continues until
11530 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11540 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
11550 20 49 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   If the compound
11560 20 71 75 65 72 79 20 6f 70 65 72 61 74 6f 72 20   query operator 
11570 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f  is UNION then no
11580 20 64 75 70 6c 69 63 61 74 65 20 72 6f 77 73 20   duplicate rows 
11590 61 72 65 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65  are ever.** inse
115a0 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20 51 75  rted into the Qu
115b0 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  eue table.  The 
115c0 69 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20  iDistinct table 
115d0 6b 65 65 70 73 20 61 20 63 6f 70 79 20 6f 66 20  keeps a copy of 
115e0 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74  all rows.** that
115f0 20 68 61 76 65 20 65 76 65 72 20 62 65 65 6e 20   have ever been 
11600 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 51 75  inserted into Qu
11610 65 75 65 20 61 6e 64 20 63 61 75 73 65 73 20 64  eue and causes d
11620 75 70 6c 69 63 61 74 65 73 20 74 6f 20 62 65 0a  uplicates to be.
11630 2a 2a 20 64 69 73 63 61 72 64 65 64 2e 20 20 49  ** discarded.  I
11640 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 69  f the operator i
11650 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65  s UNION ALL, the
11660 6e 20 64 75 70 6c 69 63 61 74 65 73 20 61 72 65  n duplicates are
11670 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a   allowed..** .**
11680 20 49 66 20 74 68 65 20 71 75 65 72 79 20 68 61   If the query ha
11690 73 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  s an ORDER BY, t
116a0 68 65 6e 20 65 6e 74 72 69 65 73 20 69 6e 20 74  hen entries in t
116b0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 61  he Queue table a
116c0 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52  re kept in.** OR
116d0 44 45 52 20 42 59 20 6f 72 64 65 72 20 61 6e 64  DER BY order and
116e0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
116f0 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 6f   is extracted fo
11700 72 20 65 61 63 68 20 63 79 63 6c 65 2e 20 20 57  r each cycle.  W
11710 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44  ithout.** an ORD
11720 45 52 20 42 59 2c 20 74 68 65 20 51 75 65 75 65  ER BY, the Queue
11730 20 74 61 62 6c 65 20 69 73 20 6a 75 73 74 20 61   table is just a
11740 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FIFO..**.** If 
11750 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 69  a LIMIT clause i
11760 73 20 70 72 6f 76 69 64 65 64 2c 20 74 68 65 6e  s provided, then
11770 20 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 73   the iteration s
11780 74 6f 70 73 20 61 66 74 65 72 20 4c 49 4d 49 54  tops after LIMIT
11790 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65 20 62 65   rows.** have be
117a0 65 6e 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  en output to pDe
117b0 73 74 2e 20 20 41 20 4c 49 4d 49 54 20 6f 66 20  st.  A LIMIT of 
117c0 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75  zero means to ou
117d0 74 70 75 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64  tput no rows and
117e0 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c   a.** negative L
117f0 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75  IMIT means to ou
11800 74 70 75 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20  tput all rows.  
11810 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 73 6f  If there is also
11820 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
11830 65 0a 2a 2a 20 77 69 74 68 20 61 20 70 6f 73 69  e.** with a posi
11840 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 65 6e  tive value, then
11850 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
11860 54 20 6f 75 74 70 75 74 73 20 61 72 65 20 64 69  T outputs are di
11870 73 63 61 72 64 65 64 20 72 61 74 68 65 72 0a 2a  scarded rather.*
11880 2a 20 74 68 61 6e 20 62 65 69 6e 67 20 73 65 6e  * than being sen
11890 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
118a0 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65   LIMIT count doe
118b0 73 20 6e 6f 74 20 62 65 67 69 6e 20 75 6e 74 69  s not begin unti
118c0 6c 20 61 66 74 65 72 20 4f 46 46 53 45 54 0a 2a  l after OFFSET.*
118d0 2a 20 72 6f 77 73 20 68 61 76 65 20 62 65 65 6e  * rows have been
118e0 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
118f0 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
11900 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75  eWithRecursiveQu
11910 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
11920 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
11930 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
11940 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
11950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11960 65 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45  e recursive SELE
11970 43 54 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  CT to be coded *
11980 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
11990 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
119a0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
119b0 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
119c0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
119d0 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20 20 20 20   = p->pSrc;     
119e0 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
119f0 75 73 65 20 6f 66 20 74 68 65 20 72 65 63 75 72  use of the recur
11a00 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
11a10 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45  int nCol = p->pE
11a20 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a  List->nExpr;  /*
11a30 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
11a40 6e 73 20 69 6e 20 74 68 65 20 72 65 63 75 72 73  ns in the recurs
11a50 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56  ive table */.  V
11a60 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
11a70 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
11a80 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
11a90 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e  tement under con
11aa0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53  struction */.  S
11ab0 65 6c 65 63 74 20 2a 70 53 65 74 75 70 20 3d 20  elect *pSetup = 
11ac0 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20  p->pPrior;   /* 
11ad0 54 68 65 20 73 65 74 75 70 20 71 75 65 72 79 20  The setup query 
11ae0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
11af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11b00 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65     /* Top of the
11b10 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
11b20 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
11b30 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54  ak;      /* CONT
11b40 49 4e 55 45 20 61 6e 64 20 42 52 45 41 4b 20 61  INUE and BREAK a
11b50 64 64 72 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e  ddresses */.  in
11b60 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
11b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11b80 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  he Current table
11b90 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 43 75 72   */.  int regCur
11ba0 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
11bb0 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
11bc0 68 6f 6c 64 69 6e 67 20 43 75 72 72 65 6e 74 20  holding Current 
11bd0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
11be0 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 20  Queue;          
11bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11c00 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
11c10 20 69 6e 74 20 69 44 69 73 74 69 6e 63 74 20 3d   int iDistinct =
11c20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
11c30 2a 20 54 6f 20 65 6e 73 75 72 65 20 75 6e 69 71  * To ensure uniq
11c40 75 65 20 72 65 73 75 6c 74 73 20 69 66 20 55 4e  ue results if UN
11c50 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65  ION */.  int eDe
11c60 73 74 20 3d 20 53 52 54 5f 46 69 66 6f 3b 20 20  st = SRT_Fifo;  
11c70 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f         /* How to
11c80 20 77 72 69 74 65 20 74 6f 20 51 75 65 75 65 20   write to Queue 
11c90 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
11ca0 64 65 73 74 51 75 65 75 65 3b 20 20 20 20 20 20  destQueue;      
11cb0 20 20 20 2f 2a 20 53 65 6c 65 63 74 44 65 73 74     /* SelectDest
11cc0 20 74 61 72 67 65 74 74 69 6e 67 20 74 68 65 20   targetting the 
11cd0 51 75 65 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20  Queue table */. 
11ce0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11d00 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11d10 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
11d40 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11d50 70 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  pOrderBy;       
11d60 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
11d70 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
11d80 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
11d90 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  Offset;       /*
11da0 20 53 61 76 65 64 20 4c 49 4d 49 54 20 61 6e 64   Saved LIMIT and
11db0 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74   OFFSET */.  int
11dc0 20 72 65 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66   regLimit, regOf
11dd0 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 52 65  fset;      /* Re
11de0 67 69 73 74 65 72 73 20 75 73 65 64 20 62 79 20  gisters used by 
11df0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11e00 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
11e10 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
11e20 6f 20 64 6f 20 61 20 72 65 63 75 72 73 69 76 65  o do a recursive
11e30 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20   query */.  if( 
11e40 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
11e50 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
11e60 52 45 43 55 52 53 49 56 45 2c 20 30 2c 20 30 2c  RECURSIVE, 0, 0,
11e70 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20   0) ) return;.. 
11e80 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
11e90 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
11ea0 20 63 6c 61 75 73 65 73 2c 20 69 66 20 74 68 65   clauses, if the
11eb0 79 20 65 78 69 73 74 20 2a 2f 0a 20 20 61 64 64  y exist */.  add
11ec0 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
11ed0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11ee0 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
11ef0 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62  w = 320;  /* 4 b
11f00 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20  illion rows */. 
11f10 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
11f20 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
11f30 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
11f40 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
11f50 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20  it;.  pOffset = 
11f60 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65  p->pOffset;.  re
11f70 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  gLimit = p->iLim
11f80 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20  it;.  regOffset 
11f90 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
11fa0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  p->pLimit = p->p
11fb0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d  Offset = 0;.  p-
11fc0 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66  >iLimit = p->iOf
11fd0 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64  fset = 0;.  pOrd
11fe0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
11ff0 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65  By;..  /* Locate
12000 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
12010 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e  er of the Curren
12020 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  t table */.  for
12030 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
12040 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29  Src->nSrc); i++)
12050 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  {.    if( pSrc->
12060 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  a[i].fg.isRecurs
12070 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75  ive ){.      iCu
12080 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b  rrent = pSrc->a[
12090 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  i].iCursor;.    
120a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
120b0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
120c0 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72  e cursors number
120d0 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20  s for Queue and 
120e0 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63  Distinct.  The c
120f0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
12100 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e  .  ** the Distin
12110 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  ct table must be
12120 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65   exactly one gre
12130 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20  ater than Queue 
12140 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f  in order.  ** fo
12150 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69  r the SRT_DistFi
12160 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51  fo and SRT_DistQ
12170 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e  ueue destination
12180 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20  s to work. */.  
12190 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d  iQueue = pParse-
121a0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70  >nTab++;.  if( p
121b0 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  ->op==TK_UNION )
121c0 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f  {.    eDest = pO
121d0 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73  rderBy ? SRT_Dis
121e0 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73  tQueue : SRT_Dis
121f0 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74  tFifo;.    iDist
12200 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e  inct = pParse->n
12210 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tab++;.  }else{.
12220 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
12230 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65  erBy ? SRT_Queue
12240 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d   : SRT_Fifo;.  }
12250 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
12260 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
12270 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
12280 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
12290 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
122a0 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
122b0 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
122c0 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
122d0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
122e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
122f0 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
12300 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
12310 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
12320 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
12330 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
12340 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
12350 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
12360 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
12370 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
12380 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
12390 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
123a0 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
123b0 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
123c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123d0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
123e0 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
123f0 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
12400 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
12410 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
12420 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12430 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
12440 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
12450 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
12460 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
12470 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
12480 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
12490 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
124a0 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
124b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
124c0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
124d0 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
124e0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
124f0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
12500 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
12510 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
12520 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
12530 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
12540 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
12550 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
12560 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
12570 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
12580 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
12590 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
125a0 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  xt = 0;.  rc = s
125b0 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
125c0 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
125d0 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
125e0 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
125f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
12600 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
12610 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
12620 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
12630 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
12640 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
12650 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
12660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12670 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
12680 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
12690 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
126a0 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  v);..  /* Transf
126b0 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
126c0 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
126d0 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
126e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
126f0 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
12700 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
12710 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
12720 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
12730 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
12740 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12750 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
12760 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
12770 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
12780 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
12790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
127a0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
127b0 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
127c0 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
127d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
127e0 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
127f0 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
12800 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
12810 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
12820 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
12830 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
12840 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
12850 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
12860 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
12870 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
12880 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
12890 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20  st, iCurrent,.  
128a0 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
128b0 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
128c0 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
128d0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
128e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
128f0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
12900 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
12910 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
12920 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
12930 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
12940 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
12950 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
12960 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
12970 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
12980 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
12990 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
129a0 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
129b0 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
129c0 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
129d0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
129e0 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
129f0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
12a00 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
12a10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12a20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
12a30 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
12a40 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
12a50 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
12a60 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
12a70 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  or = 0;.    sqli
12a80 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
12a90 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  , p, &destQueue)
12aa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
12ab0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
12ac0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53    p->pPrior = pS
12ad0 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  etup;.  }..  /* 
12ae0 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65  Keep running the
12af0 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20   loop until the 
12b00 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a  Queue is empty *
12b10 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  /.  sqlite3VdbeG
12b20 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b  oto(v, addrTop);
12b30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
12b40 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
12b50 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f  drBreak);..end_o
12b60 66 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72  f_recursive_quer
12b70 79 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  y:.  sqlite3Expr
12b80 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
12b90 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  e->db, p->pOrder
12ba0 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72 64 65 72  By);.  p->pOrder
12bb0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
12bc0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
12bd0 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  mit;.  p->pOffse
12be0 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 72  t = pOffset;.  r
12bf0 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
12c00 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
12c10 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  TE */../* Forwar
12c20 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
12c30 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
12c40 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
12c50 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12c60 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
12c70 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
12c80 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
12c90 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
12ca0 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
12cb0 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
12cc0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
12cd0 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
12ce0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
12cf0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a  y results */.);.
12d00 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68  ./*.** Handle th
12d10 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 6f  e special case o
12d20 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  f a compound-sel
12d30 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ect that origina
12d40 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41  tes from a.** VA
12d50 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20 42 79  LUES clause.  By
12d60 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73 20 61   handling this a
12d70 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
12d80 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65 70 0a  , we avoid deep.
12d90 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e  ** recursion, an
12da0 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65  d thus do not ne
12db0 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ed to enforce th
12dc0 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  e SQLITE_LIMIT_C
12dd0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a  OMPOUND_SELECT.*
12de0 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20 63 6c  * on a VALUES cl
12df0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61  ause..**.** Beca
12e00 75 73 65 20 74 68 65 20 53 65 6c 65 63 74 20 6f  use the Select o
12e10 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74 65 73  bject originates
12e20 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53 20 63   from a VALUES c
12e30 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20  lause:.**   (1) 
12e40 49 74 20 68 61 73 20 6e 6f 20 4c 49 4d 49 54 20  It has no LIMIT 
12e50 6f 72 20 4f 46 46 53 45 54 0a 2a 2a 20 20 20 28  or OFFSET.**   (
12e60 32 29 20 41 6c 6c 20 74 65 72 6d 73 20 61 72 65  2) All terms are
12e70 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a 20 20 20   UNION ALL.**   
12e80 28 33 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20  (3) There is no 
12e90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
12ea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
12eb0 6c 74 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28  ltiSelectValues(
12ec0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
12ed0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
12ee0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
12ef0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
12f00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
12f10 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
12f20 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
12f30 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
12f40 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
12f50 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
12f60 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
12f70 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  {.  Select *pPri
12f80 6f 72 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 20 3d  or;.  int nRow =
12f90 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   1;.  int rc = 0
12fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
12fb0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
12fc0 74 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b  tiValue );.  do{
12fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
12fe0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
12ff0 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65  lues );.    asse
13000 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  rt( p->op==TK_AL
13010 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f  L || (p->op==TK_
13020 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72  SELECT && p->pPr
13030 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  ior==0) );.    a
13040 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74  ssert( p->pLimit
13050 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
13060 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
13070 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13080 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  p->pNext==0 || p
13090 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
130a0 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73  =p->pNext->pELis
130b0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
130c0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
130d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
130e0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d  sert( p->pPrior-
130f0 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20  >pNext==p );.   
13100 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
13110 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 7d 77      nRow++;.  }w
13120 68 69 6c 65 28 31 29 3b 0a 20 20 77 68 69 6c 65  hile(1);.  while
13130 28 20 70 20 29 7b 0a 20 20 20 20 70 50 72 69 6f  ( p ){.    pPrio
13140 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  r = p->pPrior;. 
13150 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
13160 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13170 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
13180 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20   p, pDest);.    
13190 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
131a0 6f 72 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  or;.    if( rc )
131b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 2d 3e 6e   break;.    p->n
131c0 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 52 6f 77  SelectRow = nRow
131d0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  ;.    p = p->pNe
131e0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
131f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
13200 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
13210 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
13220 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
13230 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
13240 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
13250 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
13260 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
13270 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
13280 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
13290 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
132a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
132b0 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
132c0 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
132d0 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
132e0 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
132f0 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
13300 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
13310 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
13320 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
13330 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
13340 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
13350 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
13360 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
13370 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
13380 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
13390 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
133a0 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
133b0 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
133c0 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
133d0 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
133e0 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
133f0 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
13400 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
13410 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
13420 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
13430 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
13440 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
13450 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
13460 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
13470 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
13480 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
13490 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
134a0 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
134b0 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
134c0 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
134d0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
134e0 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
134f0 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
13500 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
13510 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
13520 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
13530 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
13540 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
13550 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
13560 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
13570 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
13580 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
13590 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
135a0 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
135b0 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
135c0 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
135d0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
135e0 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
135f0 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
13600 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
13610 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
13620 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
13630 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
13640 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
13650 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
13660 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
13670 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13680 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
13690 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
136a0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
136b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
136c0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
136d0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
136e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
136f0 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
13700 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
13710 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
13720 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
13730 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
13740 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
13750 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
13760 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
13770 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
13780 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
13790 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
137a0 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
137c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
137d0 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
137e0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
137f0 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
13800 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
13810 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
13820 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
13830 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
13840 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
13850 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
13860 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
13870 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
13880 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64  nection */.#ifnd
13890 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
138a0 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
138b0 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  b1 = 0;        /
138c0 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
138d0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
138e0 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30 3b 20   int iSub2 = 0; 
138f0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
13900 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
13910 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
13920 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
13930 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
13940 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
13950 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
13960 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
13970 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
13980 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
13990 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
139a0 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
139b0 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
139c0 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
139d0 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
139e0 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
139f0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
13a00 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72   much */.  asser
13a10 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
13a20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
13a30 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  =0 || p->op==TK_
13a40 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ALL || p->op==TK
13a50 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d  _UNION );.  db =
13a60 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
13a70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
13a80 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65  r;.  dest = *pDe
13a90 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  st;.  if( pPrior
13aa0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
13ab0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13ac0 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20  g(pParse,"ORDER 
13ad0 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  BY clause should
13ae0 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
13af0 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
13b00 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
13b10 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
13b20 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
13b30 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13b40 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d   }.  if( pPrior-
13b50 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73  >pLimit ){.    s
13b60 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13b70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61  Parse,"LIMIT cla
13b80 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
13b90 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
13ba0 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
13bb0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
13bc0 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
13bd0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
13be0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
13bf0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13c00 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
13c10 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
13c20 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
13c30 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
13c40 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
13c50 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
13c60 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
13c70 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
13c80 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
13c90 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
13ca0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
13cb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13cc0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
13cd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ce0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
13cf0 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
13d00 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
13d10 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
13d20 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
13d30 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
13d40 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
13d50 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
13d60 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
13d70 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
13d80 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
13d90 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
13da0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
13db0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
13dc0 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
13dd0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
13de0 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
13df0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
13e00 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
13e10 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
13e20 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
13e30 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
13e40 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
13e50 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
13e60 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
13e70 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13e80 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
13e90 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
13ea0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
13eb0 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
13ec0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
13ed0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13ee0 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
13ef0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
13f00 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
13f10 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
13f20 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
13f30 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
13f40 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
13f50 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
13f60 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
13f70 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
13f80 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
13f90 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
13fa0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
13fb0 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
13fc0 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
13fd0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
13fe0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47  .  }else..  /* G
13ff0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
14000 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69   the left and ri
14010 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ght SELECT state
14020 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77  ments..  */.  sw
14030 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
14040 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
14050 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
14060 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
14070 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73  nLimit;.      as
14080 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70  sert( !pPrior->p
14090 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70  Limit );.      p
140a0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20  Prior->iLimit = 
140b0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->iLimit;.     
140c0 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74   pPrior->iOffset
140d0 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20   = p->iOffset;. 
140e0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69       pPrior->pLi
140f0 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
14100 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
14110 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
14120 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  set;.      expla
14130 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14140 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14150 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14170 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14180 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ior, &dest);.   
14190 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
141a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73  ;.      p->pOffs
141b0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  et = 0;.      if
141c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
141d0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
141e0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
141f0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
14200 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69   0;.      p->iLi
14210 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
14220 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  imit;.      p->i
14230 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d  Offset = pPrior-
14240 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
14250 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b  if( p->iLimit ){
14260 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
14270 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14280 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70  1(v, OP_IfNot, p
14290 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43  ->iLimit); VdbeC
142a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
142b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
142c0 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20  (v, "Jump ahead 
142d0 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64  if LIMIT reached
142e0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  "));.        if(
142f0 20 70 2d 3e 69 4f 66 66 73 65 74 20 29 7b 0a 20   p->iOffset ){. 
14300 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14310 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14320 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 0a 20 20  _OffsetLimit,.  
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69            p->iLi
14350 6d 69 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b  mit, p->iOffset+
14360 31 2c 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a  1, p->iOffset);.
14370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14380 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  }.      explainS
14390 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
143a0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
143b0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
143c0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
143d0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
143e0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
143f0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14400 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
14410 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
14420 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
14430 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
14440 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
14450 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
14460 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c  d(p->nSelectRow,
14470 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
14480 52 6f 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Row);.      if( 
14490 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20  pPrior->pLimit. 
144a0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
144b0 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 50  ExprIsInteger(pP
144c0 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e  rior->pLimit, &n
144d0 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26 26  Limit).       &&
144e0 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e   nLimit>0 && p->
144f0 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c  nSelectRow > sql
14500 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
14510 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 29  nLimit) .      )
14520 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  {.        p->nSe
14530 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
14540 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 4c 69  3LogEst((u64)nLi
14550 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
14560 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a      if( addr ){.
14570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14580 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
14590 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
145a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
145b0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
145c0 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EPT:.    case TK
145d0 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  _UNION: {.      
145e0 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20  int unionTab;   
145f0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
14600 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61  r of the tempora
14610 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  ry table holding
14620 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
14630 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20   u8 op = 0;     
14640 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
14650 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20  SRT_ operations 
14660 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66  to apply to self
14670 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72   */.      int pr
14680 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68  iorOp;     /* Th
14690 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
146a0 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69   to apply to pri
146b0 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20  or selects */.  
146c0 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
146d0 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53  , *pOffset; /* S
146e0 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70  aved values of p
146f0 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e  ->nLimit and p->
14700 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  nOffset */.     
14710 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
14720 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f   SelectDest unio
14730 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65  ndest;..      te
14740 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
14750 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
14760 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
14770 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
14780 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53       priorOp = S
14790 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20  RT_Union;.      
147a0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
147b0 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20  priorOp ){.     
147c0 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75     /* We can reu
147d0 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  se a temporary t
147e0 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  able generated b
147f0 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75  y a SELECT to ou
14800 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67  r.        ** rig
14810 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ht..        */. 
14820 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14830 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20  ->pLimit==0 );  
14840 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
14850 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
14860 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
14870 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
14880 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20  ffset==0 );     
14890 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  /* Not allowed o
148a0 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65  n leftward eleme
148b0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  nts */.        u
148c0 6e 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69  nionTab = dest.i
148d0 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65  SDParm;.      }e
148e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
148f0 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  We will need to 
14900 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74  create our own t
14910 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74  emporary table t
14920 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20  o hold the.     
14930 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61     ** intermedia
14940 74 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  te results..    
14950 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75      */.        u
14960 6e 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65  nionTab = pParse
14970 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
14980 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
14990 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
149a0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
149b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
149c0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
149d0 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a  , unionTab, 0);.
149e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
149f0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
14a00 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  0] == -1 );.    
14a10 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
14a20 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[0] = addr;. 
14a30 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74         findRight
14a40 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67  most(p)->selFlag
14a50 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
14a60 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61  meral;.        a
14a70 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
14a80 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
14a90 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
14aa0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
14ab0 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
14ac0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
14ad0 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72  rt( !pPrior->pOr
14ae0 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73  derBy );.      s
14af0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
14b00 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c  Init(&uniondest,
14b10 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54   priorOp, unionT
14b20 61 62 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab);.      expla
14b30 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
14b40 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b1, pParse->iNex
14b50 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
14b60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
14b70 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
14b80 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  ior, &uniondest)
14b90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
14ba0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
14bb0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
14bc0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14bd0 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
14be0 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
14bf0 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ment.      */.  
14c00 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54      if( p->op==T
14c10 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20  K_EXCEPT ){.    
14c20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63      op = SRT_Exc
14c30 65 70 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ept;.      }else
14c40 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14c50 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
14c60 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20  N );.        op 
14c70 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
14c80 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
14c90 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
14ca0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
14cb0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  it;.      p->pLi
14cc0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
14cd0 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66  Offset = p->pOff
14ce0 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  set;.      p->pO
14cf0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
14d00 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74   uniondest.eDest
14d10 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70   = op;.      exp
14d20 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14d30 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
14d40 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
14d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14d60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
14d70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20  , &uniondest);. 
14d80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
14d90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
14da0 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66        /* Query f
14db0 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c  lattening in sql
14dc0 69 74 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67  ite3Select() mig
14dd0 68 74 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72  ht refill p->pOr
14de0 64 65 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20  derBy..      ** 
14df0 42 65 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74  Be sure to delet
14e00 65 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74  e p->pOrderBy, t
14e10 68 65 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f  herefore, to avo
14e20 69 64 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b  id a memory leak
14e30 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
14e40 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
14e50 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
14e60 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
14e70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
14e80 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
14e90 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
14ea0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
14eb0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d       if( p->op==
14ec0 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
14ed0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
14ee0 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
14ef0 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52  tAdd(p->nSelectR
14f00 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  ow, pPrior->nSel
14f10 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d  ectRow);.      }
14f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14f30 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
14f40 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
14f50 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
14f60 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
14f70 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20  set = pOffset;. 
14f80 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
14f90 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   0;.      p->iOf
14fa0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  fset = 0;..     
14fb0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
14fc0 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d 70  data in the temp
14fd0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74 6f  orary table into
14fe0 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a 20   whatever form. 
14ff0 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68       ** it is th
15000 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20  at we currently 
15010 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
15020 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
15030 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53 44 50  onTab==dest.iSDP
15040 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44 65 73  arm || dest.eDes
15050 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20  t!=priorOp );.  
15060 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
15070 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st!=priorOp ){. 
15080 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
15090 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
150a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
150b0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
150c0 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
150d0 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
150e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
150f0 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
15100 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
15110 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
15120 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
15130 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
15140 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
15150 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
15160 73 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63  se, pFirst->pSrc
15170 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
15180 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15190 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
151a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
151b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
151c0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
151d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
151e0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
151f0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
15200 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
15210 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15230 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
15240 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  ab, iBreak); Vdb
15250 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15260 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73        iStart = s
15270 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15280 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
15290 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
152a0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
152b0 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62  pEList, unionTab
152c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
152d0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
152e0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
152f0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
15300 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
15310 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
15320 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15330 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15340 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
15350 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43  , iStart); VdbeC
15360 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15380 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15390 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
153a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
153b0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
153c0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
153d0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
153e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
153f0 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
15400 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
15410 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
15420 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
15430 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
15440 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
15450 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
15460 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
15470 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
15480 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
15490 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
154a0 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
154b0 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
154c0 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
154d0 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
154e0 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
154f0 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
15500 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
15510 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
15520 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
15530 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
15540 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
15550 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
15560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
15570 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
15580 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
15590 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
155a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
155b0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
155c0 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
155d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
155e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
155f0 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
15600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15610 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
15620 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
15630 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
15640 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
15650 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
15660 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
15670 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
15680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15690 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
156a0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
156b0 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
156c0 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
156d0 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
156e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
156f0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
15700 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
15710 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
15720 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
15730 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
15740 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
15750 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
15760 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15770 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
15780 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
15790 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
157a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
157b0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
157c0 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
157d0 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
157e0 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
157f0 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
15800 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
15810 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
15820 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15830 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
15840 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
15850 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
15860 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
15870 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
15880 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
15890 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
158a0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
158b0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
158c0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
158d0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
158e0 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
158f0 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
15900 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
15910 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
15920 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
15930 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
15940 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
15950 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
15960 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
15970 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15980 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
15990 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
159a0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
159b0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
159c0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
159d0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
159e0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
159f0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
15a00 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
15a10 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
15a20 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
15a30 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
15a40 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
15a50 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
15a60 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
15a70 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
15a80 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15a90 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
15aa0 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
15ab0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
15ac0 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
15ad0 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
15ae0 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
15af0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
15b00 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15b10 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15b20 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
15b30 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
15b40 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
15b50 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
15b60 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
15b70 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
15b80 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
15b90 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
15ba0 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
15bb0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
15bc0 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c 20  , pFirst->pSrc, 
15bd0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
15be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15bf0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
15c00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15c10 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
15c20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
15c30 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
15c40 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
15c50 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
15c60 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
15c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15c80 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
15c90 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62  b1, iBreak); Vdb
15ca0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15cb0 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
15cc0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
15cd0 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
15ce0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15cf0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
15d00 74 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20  ta, tab1, r1);. 
15d10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15d20 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
15d30 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20  NotFound, tab2, 
15d40 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 20 56  iCont, r1, 0); V
15d50 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
15d70 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15d80 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  se, r1);.      s
15d90 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
15da0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
15db0 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20 20 20  ist, tab1,.     
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
15de0 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
15df0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15e00 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15e10 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
15e20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15e30 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
15e40 20 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f   iStart); VdbeCo
15e50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
15e60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15e70 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
15e80 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
15e90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15ea0 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20  OP_Close, tab2, 
15eb0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
15ec0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15ed0 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
15ee0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15ef0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70      }.  }..  exp
15f00 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
15f10 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
15f20 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70  b1, iSub2, p->op
15f30 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a  !=TK_ALL);..  /*
15f40 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
15f50 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
15f60 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  d by .  ** tempo
15f70 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
15f80 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
15f90 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
15fa0 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
15fb0 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
15fc0 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
15fd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
15fe0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
15ff0 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
16000 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
16010 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16020 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
16030 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
16040 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
16050 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
16060 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
16070 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
16080 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
16090 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
160a0 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
160b0 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
160c0 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
160d0 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
160e0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
160f0 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65   & SF_UsesEpheme
16100 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ral ){.    int i
16110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16120 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
16130 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
16140 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16150 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
16160 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
16170 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
16180 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
16190 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
161a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
161b0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
161c0 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
161d0 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
161e0 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
161f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
16200 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
16210 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
16220 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
16230 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
16240 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16250 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
16260 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
16270 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4e     assert( p->pN
16280 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e 43  ext==0 );.    nC
16290 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
162a0 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
162b0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
162c0 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43  InfoAlloc(db, nC
162d0 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ol, 1);.    if( 
162e0 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
162f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
16300 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
16310 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
16320 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
16330 20 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c    for(i=0, apCol
16340 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  l=pKeyInfo->aCol
16350 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
16360 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20  apColl++){.     
16370 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69   *apColl = multi
16380 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
16390 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
163a0 20 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c     if( 0==*apCol
163b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70  l ){.        *ap
163c0 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
163d0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
163e0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f    }..    for(pLo
163f0 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f  op=p; pLoop; pLo
16400 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
16410 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
16420 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
16430 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
16440 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
16450 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  phm[i];.        
16460 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20  if( addr<0 ){.  
16470 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30          /* If [0
16480 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e  ] is unused then
16490 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75   [1] is also unu
164a0 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a  sed.  So we can.
164b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77            ** alw
164c0 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74  ays safely abort
164d0 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   as soon as the 
164e0 66 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f  first unused slo
164f0 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  t is found */.  
16500 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16510 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
16520 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20  phm[1]<0 );.    
16530 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
16550 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
16560 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c  P2(v, addr, nCol
16570 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16580 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
16590 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73  , addr, (char*)s
165a0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66  qlite3KeyInfoRef
165b0 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20  (pKeyInfo),.    
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165d0 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e          P4_KEYIN
165e0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f  FO);.        pLo
165f0 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  op->addrOpenEphm
16600 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  [i] = -1;.      
16610 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
16620 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
16630 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a  pKeyInfo);.  }..
16640 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
16650 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74  :.  pDest->iSdst
16660 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20   = dest.iSdst;. 
16670 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20   pDest->nSdst = 
16680 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71  dest.nSdst;.  sq
16690 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
166a0 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a  e(db, pDelete);.
166b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
166c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
166d0 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
166e0 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45  LECT */../*.** E
166f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
16700 20 77 68 65 6e 20 74 77 6f 20 6f 72 20 6d 6f 72   when two or mor
16710 65 20 74 65 72 6d 73 20 6f 66 20 61 20 63 6f 6d  e terms of a com
16720 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 68 61 76  pound select hav
16730 65 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 73  e different.** s
16740 69 7a 65 20 72 65 73 75 6c 74 20 73 65 74 73 2e  ize result sets.
16750 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16760 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  SelectWrongNumTe
16770 72 6d 73 45 72 72 6f 72 28 50 61 72 73 65 20 2a  rmsError(Parse *
16780 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
16790 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  p){.  if( p->sel
167a0 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65  Flags & SF_Value
167b0 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  s ){.    sqlite3
167c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
167d0 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73   "all VALUES mus
167e0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
167f0 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22  number of terms"
16800 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16810 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16820 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
16830 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
16840 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
16850 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
16860 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16870 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
16880 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
16890 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a  me(p->op));.  }.
168a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  }../*.** Code an
168b0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
168c0 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69  ne for a corouti
168d0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ne implementatio
168e0 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54  n of a.** SELECT
168f0 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   statment..**.**
16900 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65 20   The data to be 
16910 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69  output is contai
16920 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73  ned in pIn->iSds
16930 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a  t.  There are.**
16940 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75   pIn->nSdst colu
16950 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74  mns to be output
16960 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65 72  .  pDest is wher
16970 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f  e the output sho
16980 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a  uld.** be sent..
16990 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20  **.** regReturn 
169a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
169b0 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68 6f   the register ho
169c0 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75  lding the subrou
169d0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61  tine.** return a
169e0 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ddress..**.** If
169f0 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20   regPrev>0 then 
16a00 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  it is the first 
16a10 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76 65  register in a ve
16a20 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63  ctor that.** rec
16a30 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f 75  ords the previou
16a40 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72  s output.  mem[r
16a50 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61  egPrev] is a fla
16a60 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a  g that is false.
16a70 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73 20  ** if there has 
16a80 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73  been no previous
16a90 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65 67   output.  If reg
16aa0 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65  Prev>0 then code
16ab0 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64   is.** generated
16ac0 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75 70   to suppress dup
16ad0 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e  licates.  pKeyIn
16ae0 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20 63  fo is used for c
16af0 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73  omparing.** keys
16b00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c  ..**.** If the L
16b10 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d  IMIT found in p-
16b20 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68  >iLimit is reach
16b30 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  ed, jump immedia
16b40 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61  tely to.** iBrea
16b50 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
16b60 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
16b70 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72  ubroutine(.  Par
16b80 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
16b90 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
16ba0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
16bb0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
16bc0 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
16bd0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
16be0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49    SelectDest *pI
16bf0 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72  n,        /* Cor
16c00 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67  outine supplying
16c10 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
16c20 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
16c30 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73     /* Where to s
16c40 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a  end the data */.
16c50 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c    int regReturn,
16c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16c70 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
16c80 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e  register */.  in
16c90 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20 20  t regPrev,      
16ca0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
16cb0 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74 65  s result registe
16cc0 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73  r.  No uniquenes
16cd0 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49  s if 0 */.  KeyI
16ce0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
16cf0 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61      /* For compa
16d00 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f  ring with previo
16d10 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e  us entry */.  in
16d20 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
16d30 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
16d40 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
16d50 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
16d60 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
16d70 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
16d80 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
16d90 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
16da0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16db0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
16dc0 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
16dd0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16de0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
16df0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
16e00 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
16e10 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
16e20 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
16e30 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 31  ){.    int addr1
16e40 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 61 64 64  , addr2;.    add
16e50 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
16e60 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
16e70 6f 74 2c 20 72 65 67 50 72 65 76 29 3b 20 56 64  ot, regPrev); Vd
16e80 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16e90 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16ea0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16eb0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
16ec0 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
16ed0 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20  1, pIn->nSdst,. 
16ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
16f00 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
16f10 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
16f20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
16f30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16f40 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
16f50 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e 74 69 6e  addr2+2, iContin
16f60 75 65 2c 20 61 64 64 72 32 2b 32 29 3b 20 56 64  ue, addr2+2); Vd
16f70 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
16f80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16f90 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
16fa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16fb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
16fc0 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  py, pIn->iSdst, 
16fd0 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
16fe0 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71  nSdst-1);.    sq
16ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17000 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
17010 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a  , regPrev);.  }.
17020 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
17030 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17040 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
17050 20 53 75 70 70 72 65 73 73 20 74 68 65 20 66 69   Suppress the fi
17060 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69  rst OFFSET entri
17070 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  es if there is a
17080 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a  n OFFSET clause.
17090 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65    */.  codeOffse
170a0 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
170b0 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20   iContinue);..  
170c0 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
170d0 44 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73  Dest!=SRT_Exists
170e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
170f0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
17100 54 61 62 6c 65 20 29 3b 0a 20 20 73 77 69 74 63  Table );.  switc
17110 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
17120 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
17130 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
17140 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
17150 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
17160 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
17170 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
17180 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
17190 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
171a0 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20  .      int r2 = 
171b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
171c0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
171d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
171e0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
171f0 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
17200 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
17210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
17220 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17230 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
17240 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
17250 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17260 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
17270 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
17280 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
17290 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
172a0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
172b0 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
172c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
172d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
172e0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
172f0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
17300 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
17310 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17330 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
17340 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
17350 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
17360 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
17370 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 20 20 20  ELECT ...)"..   
17380 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
17390 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _Set: {.      in
173a0 74 20 72 31 3b 0a 20 20 20 20 20 20 74 65 73 74  t r1;.      test
173b0 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74  case( pIn->nSdst
173c0 3e 31 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  >1 );.      r1 =
173d0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
173e0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
173f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17400 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
17410 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
17420 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 0a 20  , pIn->nSdst, . 
17430 20 20 20 20 20 20 20 20 20 72 31 2c 20 70 44 65           r1, pDe
17440 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 70 49  st->zAffSdst, pI
17450 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17460 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
17470 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
17480 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64  pParse, pIn->iSd
17490 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  st, pIn->nSdst);
174a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
174b0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
174c0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
174d0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
174e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
174f0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 2d              pIn-
17500 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
17510 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
17520 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
17530 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
17540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17550 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
17560 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
17570 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
17580 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
17590 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
175a0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
175b0 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
175c0 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
175d0 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
175e0 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
175f0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
17600 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
17610 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
17620 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 7c 7c  pIn->nSdst==1 ||
17630 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20   pParse->nErr>0 
17640 29 3b 20 20 74 65 73 74 63 61 73 65 28 20 70 49  );  testcase( pI
17650 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29 3b 0a 20  n->nSdst!=1 );. 
17660 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17670 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
17680 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
17690 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
176a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
176b0 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
176c0 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
176d0 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
176e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
176f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
17700 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17710 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
17720 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
17730 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
17740 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
17750 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
17760 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
17770 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
17780 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
17790 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
177a0 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
177b0 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
177c0 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
177d0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
177e0 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
177f0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
17800 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
17810 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
17820 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
17830 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
17840 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
17850 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
17860 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
17870 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17880 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
17890 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
178a0 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74   OP_Yield, pDest
178b0 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
178c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
178d0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f      /* If none o
178e0 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68 65  f the above, the
178f0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65 73  n the result des
17900 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  tination must be
17910 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70  .    ** SRT_Outp
17920 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
17930 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
17940 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65 72  d with any other
17950 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61 74  .    ** destinat
17960 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ion other than t
17970 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20  he ones handled 
17980 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75 74  above or SRT_Out
17990 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  put..    **.    
179a0 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70 75  ** For SRT_Outpu
179b0 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  t, results are s
179c0 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
179d0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
179e0 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20  .  .    ** Then 
179f0 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
17a00 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64 20   opcode is used 
17a10 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65 33  to cause sqlite3
17a20 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20 2a  _step() to.    *
17a30 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 78  * return the nex
17a40 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e  t row of result.
17a50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
17a60 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
17a70 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ert( pDest->eDes
17a80 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
17a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17aa0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17ab0 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69  esultRow, pIn->i
17ac0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17ad0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17ae0 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
17af0 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
17b00 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
17b10 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 62  >nSdst);.      b
17b20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
17b30 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
17b40 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
17b50 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
17b60 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
17b70 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
17b80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
17b90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44  beAddOp2(v, OP_D
17ba0 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 70 2d 3e  ecrJumpZero, p->
17bb0 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b  iLimit, iBreak);
17bc0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17bd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
17be0 72 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74  rate the subrout
17bf0 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  ine return.  */.
17c00 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17c10 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f  olveLabel(v, iCo
17c20 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74  ntinue);.  sqlit
17c30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
17c40 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65  OP_Return, regRe
17c50 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e  turn);..  return
17c60 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
17c70 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70  Alternative comp
17c80 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65  ound select code
17c90 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63   generator for c
17ca0 61 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a  ases when there.
17cb0 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  ** is an ORDER B
17cc0 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  Y clause..**.** 
17cd0 57 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72  We assume a quer
17ce0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
17cf0 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  ng form:.**.**  
17d00 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c      <selectA>  <
17d10 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65  operator>  <sele
17d20 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c  ctB>  ORDER BY <
17d30 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a  orderbylist>.**.
17d40 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
17d50 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c   one of UNION AL
17d60 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54  L, UNION, EXCEPT
17d70 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20  , or INTERSECT. 
17d80 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20   The idea.** is 
17d90 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65  to code both <se
17da0 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65  lectA> and <sele
17db0 63 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52  ctB> with the OR
17dc0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
17dd0 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e  .** co-routines.
17de0 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63    Then run the c
17df0 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61  o-routines in pa
17e00 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65  rallel and merge
17e10 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
17e20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  into the output.
17e30 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
17e40 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69   the two corouti
17e50 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65  nes (called sele
17e60 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63  ctA and.** selec
17e70 74 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20  tB) there are 7 
17e80 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a  subroutines:.**.
17e90 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d  **    outA:    M
17ea0 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
17eb0 66 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f  f the selectA co
17ec0 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
17ed0 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
17ee0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
17ef0 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a  mpound query..**
17f00 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20  .**    outB:    
17f10 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20  Move the output 
17f20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63  of the selectB c
17f30 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68  oroutine into th
17f40 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20  e output.**     
17f50 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63          of the c
17f60 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20  ompound query.  
17f70 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20  (Only generated 
17f80 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a  for UNION and.**
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
17fa0 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20  ON ALL.  EXCEPT 
17fb0 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e  and INSERTSECT n
17fc0 65 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f  ever output a ro
17fd0 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  w that.**       
17fe0 20 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e        appears on
17ff0 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20  ly in B.).**.** 
18000 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c     AltB:    Call
18010 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
18020 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20   data from both 
18030 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41  coroutines and A
18040 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71  <B..**.**    Aeq
18050 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
18060 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
18070 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
18080 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a  ines and A==B..*
18090 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20  *.**    AgtB:   
180a0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
180b0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
180c0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
180d0 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A>B..**.**  
180e0 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65    EofA:    Calle
180f0 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
18100 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
18110 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  lectA..**.**    
18120 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofB:    Called 
18130 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
18140 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
18150 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ctB..**.** The i
18160 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
18170 20 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65   the latter five
18180 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70   subroutines dep
18190 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a  end on which .**
181a0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75   <operator> is u
181b0 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20  sed:.**.**.**   
181c0 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20            UNION 
181d0 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f  ALL         UNIO
181e0 4e 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43  N            EXC
181f0 45 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54  EPT          INT
18200 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  ERSECT.**       
18210 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
18220 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
18230 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
18240 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
18250 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42  ------.**   AltB
18260 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
18270 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
18280 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
18290 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41  tA         nextA
182a0 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20  .**.**   AeqB:  
182b0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
182c0 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
182d0 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
182e0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
182f0 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20  .**.**   AgtB:  
18300 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
18310 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
18320 20 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20         nextB    
18330 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a          nextB.**
18340 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75  .**   EofA:   ou
18350 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f  tB, nextB      o
18360 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
18370 20 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20      halt        
18380 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
18390 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20    EofB:   outA, 
183a0 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c  nextA      outA,
183b0 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74   nextA       out
183c0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20  A, nextA        
183d0 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74   halt.**.** In t
183e0 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61  he AltB, AeqB, a
183f0 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69  nd AgtB subrouti
18400 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41  nes, an EOF on A
18410 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41   following nextA
18420 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d  .** causes an im
18430 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20  mediate jump to 
18440 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20  EofA and an EOF 
18450 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on B following n
18460 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61  extB causes.** a
18470 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
18480 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69   to EofB.  Withi
18490 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c  n EofA and EofB,
184a0 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72   and EOF on entr
184b0 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  y or.** followin
184c0 67 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61  g nextX causes a
184d0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   jump to the end
184e0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70   of the select p
184f0 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
18500 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   Duplicate remov
18510 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c  al in the UNION,
18520 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54   EXCEPT, and INT
18530 45 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20  ERSECT cases is 
18540 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69  handled.** withi
18550 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  n the output sub
18560 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65  routine.  The re
18570 67 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73  gPrev register s
18580 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65  et holds the pre
18590 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75  viously.** outpu
185a0 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70  t value.  A comp
185b0 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61  arison is made a
185c0 67 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75  gainst this valu
185d0 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  e and the output
185e0 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69  .** is skipped i
185f0 66 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c  f the next resul
18600 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20  ts would be the 
18610 73 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76  same as the prev
18620 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ious..**.** The 
18630 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70  implementation p
18640 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d  lan is to implem
18650 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f  ent the two coro
18660 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e  utines and seven
18670 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20  .** subroutines 
18680 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20  first, then put 
18690 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69  the control logi
186a0 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e  c at the bottom.
186b0 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a    Like this:.**.
186c0 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  **          goto
186d0 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41   Init.**     coA
186e0 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
186f0 6c 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a  left query (A).*
18700 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75  *     coB: corou
18710 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71  tine for right q
18720 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f  uery (B).**    o
18730 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utA: output one 
18740 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f  row of A.**    o
18750 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20  utB: output one 
18760 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20  row of B (UNION 
18770 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e  and UNION ALL on
18780 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20  ly).**    EofA: 
18790 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  ....**    EofB: 
187a0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  ....**    AltB: 
187b0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20  ....**    AeqB: 
187c0 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  ....**    AgtB: 
187d0 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20  ....**    Init: 
187e0 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75  initialize corou
187f0 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a  tine registers.*
18800 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
18810 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20   coA.**         
18820 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20   if eof(A) goto 
18830 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  EofA.**         
18840 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20   yield coB.**   
18850 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29         if eof(B)
18860 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20   goto EofB.**   
18870 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41   Cmpr: Compare A
18880 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  , B.**          
18890 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c  Jump AltB, AeqB,
188a0 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64   AgtB.**     End
188b0 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63  : ....**.** We c
188c0 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  all AltB, AeqB, 
188d0 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20  AgtB, EofA, and 
188e0 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65  EofB "subroutine
188f0 73 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20  s" but they are 
18900 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20  not.** actually 
18910 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73  called using Gos
18920 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e  ub and they do n
18930 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41  ot Return.  EofA
18940 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a   and EofB loop.*
18950 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61  * until all data
18960 20 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68   is exhausted th
18970 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22  en jump to the "
18980 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42  end" labe.  AltB
18990 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41  , AeqB,.** and A
189a0 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68  gtB jump to eith
189b0 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20  er L2 or to one 
189c0 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e  of EofA or EofB.
189d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
189e0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
189f0 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69  _SELECT.static i
18a00 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
18a10 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
18a20 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
18a30 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
18a40 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
18a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18a60 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
18a70 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
18a80 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
18a90 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
18aa0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
18ab0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
18ac0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
18ad0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
18ae0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
18af0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
18b00 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
18b10 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
18b20 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
18b30 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
18b40 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
18b50 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
18b60 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
18b70 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
18b80 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73  estA;     /* Des
18b90 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72  tination for cor
18ba0 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65  outine A */.  Se
18bb0 6c 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20  lectDest destB; 
18bc0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
18bd0 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
18be0 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41   B */.  int regA
18bf0 64 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrA;         /*
18c00 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
18c10 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63  r for select-A c
18c20 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
18c30 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
18c40 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
18c50 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
18c60 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
18c70 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
18c80 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
18c90 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
18ca0 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
18cb0 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
18cc0 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
18cd0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
18ce0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
18cf0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
18d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
18d10 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18d20 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
18d30 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18d40 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
18d50 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18d60 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
18d70 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
18d80 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
18d90 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
18da0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
18db0 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
18dc0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
18dd0 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20  ddrOutB = 0;    
18de0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
18df0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
18e00 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18e10 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
18e20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
18e30 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
18e40 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
18e50 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
18e60 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20  ofA_noB;     /* 
18e70 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f  Alternate addrEo
18e80 66 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69  fA if B is unini
18e90 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e  tialized */.  in
18ea0 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20  t addrEofB;     
18eb0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
18ec0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65  f the select-B-e
18ed0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
18ee0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18ef0 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f  rAltB;         /
18f00 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18f10 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20   A<B subroutine 
18f20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71  */.  int addrAeq
18f30 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
18f40 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d  dress of the A==
18f50 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
18f60 20 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20    int addrAgtB; 
18f70 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
18f80 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75  ss of the A>B su
18f90 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18fa0 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20  t regLimitA;    
18fb0 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67      /* Limit reg
18fc0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
18fd0 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  -A */.  int regL
18fe0 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a  imitB;        /*
18ff0 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
19000 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
19010 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20    int regPrev;  
19020 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e          /* A ran
19030 67 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ge of registers 
19040 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73  to hold previous
19050 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74   output */.  int
19060 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20   savedLimit;    
19070 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
19080 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a  e of p->iLimit *
19090 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66  /.  int savedOff
190a0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76  set;      /* Sav
190b0 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69  ed value of p->i
190c0 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  Offset */.  int 
190d0 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20  labelCmpr;      
190e0 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74    /* Label for t
190f0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
19100 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
19110 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e  */.  int labelEn
19120 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  d;         /* La
19130 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20  bel for the end 
19140 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53  of the overall S
19150 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20  ELECT stmt */.  
19160 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20  int addr1;      
19170 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e        /* Jump in
19180 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20  structions that 
19190 67 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20  get retargetted 
191a0 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  */.  int op;    
191b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
191c0 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f  e of TK_ALL, TK_
191d0 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
191e0 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a  , TK_INTERSECT *
191f0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
19200 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d  yDup = 0; /* Com
19210 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
19220 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
19230 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b  e removal */.  K
19240 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67  eyInfo *pKeyMerg
19250 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  e;   /* Comparis
19260 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  on information f
19270 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20  or merging rows 
19280 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
19290 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
192a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
192b0 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  n */.  ExprList 
192c0 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20  *pOrderBy;   /* 
192d0 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
192e0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72  use */.  int nOr
192f0 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f  derBy;         /
19300 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
19310 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
19320 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
19330 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20  t *aPermute;    
19340 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
19350 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72  rom ORDER BY ter
19360 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74  ms to result set
19370 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e   columns */.#ifn
19380 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19390 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53  EXPLAIN.  int iS
193a0 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub1;            
193b0 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66  /* EQP id of lef
193c0 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a  t-hand query */.
193d0 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20    int iSub2;    
193e0 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
193f0 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  d of right-hand 
19400 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a  query */.#endif.
19410 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
19420 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61  rderBy!=0 );.  a
19430 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d  ssert( pKeyDup==
19440 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64  0 ); /* "Managed
19450 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69  " code needs thi
19460 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32  s.  Ticket #3382
19470 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  . */.  db = pPar
19480 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50  se->db;.  v = pP
19490 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
194a0 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20  ssert( v!=0 );  
194b0 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20       /* Already 
194c0 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72  thrown the error
194d0 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66   if VDBE alloc f
194e0 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c  ailed */.  label
194f0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
19500 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19510 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c   labelCmpr = sql
19520 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
19530 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74  l(v);...  /* Pat
19540 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20  ch up the ORDER 
19550 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  BY clause.  */. 
19560 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20   op = p->op;  . 
19570 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
19580 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
19590 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d  Prior->pOrderBy=
195a0 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  =0 );.  pOrderBy
195b0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
195c0 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
195d0 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79  By );.  nOrderBy
195e0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
195f0 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70  pr;..  /* For op
19600 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68  erators other th
19610 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20  an UNION ALL we 
19620 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  have to make sur
19630 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  e that.  ** the 
19640 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
19650 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72  covers every ter
19660 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  m of the result 
19670 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74  set.  Add.  ** t
19680 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45  erms to the ORDE
19690 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e  R BY clause as n
196a0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
196b0 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20   if( op!=TK_ALL 
196c0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
196d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
196e0 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c  ==0 && i<=p->pEL
196f0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
19700 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
19710 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19720 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  tem;.      for(j
19730 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
19740 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42  By->a; j<nOrderB
19750 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; j++, pItem++)
19760 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
19770 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
19780 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20  derByCol>0 );.  
19790 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
197a0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
197b0 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==i ) break;.   
197c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
197d0 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ==nOrderBy ){.  
197e0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
197f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
19800 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
19810 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19820 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
19830 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
19840 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  T;.        pNew-
19850 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
19860 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
19870 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
19880 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f  i;.        p->pO
19890 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
198a0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
198b0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
198c0 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77  , pOrderBy, pNew
198d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
198e0 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
198f0 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
19900 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
19910 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  l = (u16)i;.    
19920 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19930 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
19940 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
19950 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
19960 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
19970 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
19980 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74  rmutation used t
19990 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
199a0 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
199b0 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
199c0 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
199d0 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
199e0 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
199f0 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
19a00 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19a10 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
19a20 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
19a30 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
19a40 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
19a50 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
19a60 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
19a70 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
19a80 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
19a90 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
19aa0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
19ab0 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
19ac0 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29  *(nOrderBy + 1))
19ad0 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65  ;.  if( aPermute
19ae0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
19af0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
19b00 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74  tem;.    aPermut
19b10 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b  e[0] = nOrderBy;
19b20 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49  .    for(i=1, pI
19b30 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
19b40 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b   i<=nOrderBy; i+
19b50 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
19b60 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
19b70 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
19b80 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  l>0 );.      ass
19b90 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
19ba0 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e  iOrderByCol<=p->
19bb0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
19bc0 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b  .      aPermute[
19bd0 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  i] = pItem->u.x.
19be0 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
19bf0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
19c00 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65  erge = multiSele
19c10 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
19c20 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
19c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
19c40 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  yMerge = 0;.  }.
19c50 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74  .  /* Reattach t
19c60 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19c70 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e  se to the query.
19c80 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65  .  */.  p->pOrde
19c90 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
19ca0 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72    pPrior->pOrder
19cb0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
19cc0 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e  ListDup(pParse->
19cd0 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  db, pOrderBy, 0)
19ce0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
19cf0 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70   a range of temp
19d00 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20  orary registers 
19d10 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  and the KeyInfo 
19d20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20  needed.  ** for 
19d30 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72  the logic that r
19d40 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65  emoves duplicate
19d50 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65   result rows whe
19d60 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61  n the.  ** opera
19d70 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58  tor is UNION, EX
19d80 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
19d90 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f  CT (but not UNIO
19da0 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69  N ALL)..  */.  i
19db0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
19dc0 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30  .    regPrev = 0
19dd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19de0 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45  nt nExpr = p->pE
19df0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
19e00 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42   assert( nOrderB
19e10 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  y>=nExpr || db->
19e20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19e30 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
19e40 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
19e50 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
19e60 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73  = nExpr+1;.    s
19e70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19e80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
19e90 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
19ea0 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
19eb0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
19ec0 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
19ed0 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b    if( pKeyDup ){
19ee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
19ef0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
19f00 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70  riteable(pKeyDup
19f10 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ) );.      for(i
19f20 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  =0; i<nExpr; i++
19f30 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  ){.        pKeyD
19f40 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d  up->aColl[i] = m
19f50 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
19f60 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b  q(pParse, p, i);
19f70 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70  .        pKeyDup
19f80 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
19f90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
19fa0 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65   }.  }. .  /* Se
19fb0 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20  parate the left 
19fc0 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75  and the right qu
19fd0 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f  ery from one ano
19fe0 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  ther.  */.  p->p
19ff0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72  Prior = 0;.  pPr
1a000 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ior->pNext = 0;.
1a010 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
1a020 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
1a030 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
1a040 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
1a050 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
1a060 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
1a070 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
1a080 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
1a090 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
1a0a0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
1a0b0 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
1a0c0 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
1a0d0 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
1a0e0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
1a0f0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
1a100 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
1a110 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
1a120 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
1a130 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
1a140 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1a150 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
1a160 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
1a170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a180 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
1a190 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
1a1a0 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
1a1b0 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
1a1e0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
1a1f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a200 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
1a210 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
1a220 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
1a230 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
1a240 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1a250 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a260 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
1a270 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1a280 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1a290 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
1a2a0 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
1a2b0 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
1a2c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1a2d0 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
1a2e0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1a2f0 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50    regOutA = ++pP
1a300 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
1a310 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65  gOutB = ++pParse
1a320 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65  ->nMem;.  sqlite
1a330 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
1a340 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f  &destA, SRT_Coro
1a350 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29  utine, regAddrA)
1a360 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1a370 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42  tDestInit(&destB
1a380 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1a390 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f   regAddrB);..  /
1a3a0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72  * Generate a cor
1a3b0 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61  outine to evalua
1a3c0 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  te the SELECT st
1a3d0 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20  atement to the. 
1a3e0 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20   ** left of the 
1a3f0 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f  compound operato
1a400 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65  r - the "A" sele
1a410 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ct..  */.  addrS
1a420 65 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33  electA = sqlite3
1a430 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1a440 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1a450 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1a460 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1a470 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1a480 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
1a490 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
1a4a0 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
1a4b0 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
1a4c0 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
1a4d0 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65  itA;.  explainSe
1a4e0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
1a4f0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
1a500 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
1a510 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
1a520 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b  pPrior, &destA);
1a530 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  .  sqlite3VdbeEn
1a540 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65  dCoroutine(v, re
1a550 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
1a560 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1a570 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 2f 2a 20  , addr1);..  /* 
1a580 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75  Generate a corou
1a590 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65  tine to evaluate
1a5a0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
1a5b0 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74  ement on .  ** t
1a5c0 68 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22  he right - the "
1a5d0 42 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20  B" select.  */. 
1a5e0 20 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73   addrSelectB = s
1a5f0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
1a600 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
1a610 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
1a620 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
1a630 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
1a640 65 67 41 64 64 72 42 2c 20 30 2c 20 61 64 64 72  egAddrB, 0, addr
1a650 53 65 6c 65 63 74 42 29 3b 0a 20 20 56 64 62 65  SelectB);.  Vdbe
1a660 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 69 67  Comment((v, "rig
1a670 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
1a680 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
1a690 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
1a6a0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
1a6b0 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
1a6c0 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
1a6d0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
1a6e0 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
1a6f0 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
1a700 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
1a710 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
1a720 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
1a730 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
1a740 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
1a750 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1a760 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
1a770 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
1a780 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41 64  routine(v, regAd
1a790 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
1a7a0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
1a7b0 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
1a7c0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
1a7d0 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
1a7e0 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
1a7f0 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
1a800 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
1a810 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
1a820 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
1a830 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
1a840 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
1a850 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
1a860 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1a870 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1a880 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
1a890 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
1a8a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a8b0 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1a8c0 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1a8d0 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
1a8e0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1a8f0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1a900 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1a910 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
1a920 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1a930 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1a940 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1a950 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
1a960 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
1a970 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
1a980 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1a990 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
1a9a0 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
1a9b0 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
1a9c0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
1a9d0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1a9e0 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
1a9f0 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
1aa00 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
1aa10 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
1aa20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
1aa30 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
1aa40 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
1aa50 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
1aa60 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
1aa70 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
1aa80 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
1aa90 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
1aaa0 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
1aab0 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
1aac0 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
1aad0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1aae0 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
1aaf0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1ab00 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
1ab10 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61   = addrEofA = la
1ab20 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  belEnd;.  }else{
1ab30 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
1ab40 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
1ab50 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
1ab60 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
1ab70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ab80 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
1ab90 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
1aba0 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  );.    addrEofA_
1abb0 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  noB = sqlite3Vdb
1abc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1abd0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c  eld, regAddrB, l
1abe0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20 20  abelEnd);.      
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
1ac10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1ac20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1ac30 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41 29  oto(v, addrEofA)
1ac40 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  ;.    p->nSelect
1ac50 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
1ac60 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
1ac70 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
1ac80 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a  electRow);.  }..
1ac90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1aca0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75  subroutine to ru
1acb0 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c  n when the resul
1acc0 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42  ts from select B
1acd0 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73  .  ** are exhaus
1ace0 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74  ted and only dat
1acf0 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65  a in select A re
1ad00 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  mains..  */.  if
1ad10 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45  ( op==TK_INTERSE
1ad20 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f  CT ){.    addrEo
1ad30 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20  fB = addrEofA;. 
1ad40 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
1ad50 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e  tRow > pPrior->n
1ad60 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e  SelectRow ) p->n
1ad70 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69  SelectRow = pPri
1ad80 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
1ad90 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56    }else{  .    V
1ada0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1adb0 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75  v, "eof-B subrou
1adc0 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1add0 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56  rEofB = sqlite3V
1ade0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1adf0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1ae00 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20 73  addrOutA);.    s
1ae10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ae20 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1ae30 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64  gAddrA, labelEnd
1ae40 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1ae50 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1ae60 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 45  dbeGoto(v, addrE
1ae70 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
1ae80 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1ae90 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
1aea0 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
1aeb0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1aec0 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
1aed0 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
1aee0 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
1aef0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1af00 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
1af10 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
1af20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1af30 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1af40 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1af50 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1af60 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1af70 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1af80 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1af90 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
1afa0 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42  the case of A==B
1afb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1afc0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64  TK_ALL ){.    ad
1afd0 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
1afe0 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  B;.  }else if( o
1aff0 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
1b000 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
1b010 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20  = addrAltB;.    
1b020 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65  addrAltB++;.  }e
1b030 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f  lse{.    VdbeNoo
1b040 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1b050 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  eq-B subroutine"
1b060 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42  ));.    addrAeqB
1b070 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   =.    sqlite3Vd
1b080 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1b090 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
1b0a0 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43  addrEofA); VdbeC
1b0b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1b0c0 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1b0d0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
1b0e0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
1b0f0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1b100 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
1b110 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
1b120 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
1b130 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
1b140 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
1b150 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
1b160 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
1b170 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
1b180 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
1b190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b1a0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1b1b0 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
1b1c0 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
1b1d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b1e0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b1f0 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20  drB, addrEofB); 
1b200 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b210 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f  .  sqlite3VdbeGo
1b220 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  to(v, labelCmpr)
1b230 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64  ;..  /* This cod
1b240 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69  e runs once to i
1b250 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74  nitialize everyt
1b260 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  hing..  */.  sql
1b270 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1b280 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71  (v, addr1);.  sq
1b290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b2a0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b2b0 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f  AddrA, addrEofA_
1b2c0 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61  noB); VdbeCovera
1b2d0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
1b2e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1b2f0 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
1b300 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62  , addrEofB); Vdb
1b310 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
1b320 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68   /* Implement th
1b330 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f  e main merge loo
1b340 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
1b350 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1b360 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1b370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1b380 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74  Op4(v, OP_Permut
1b390 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  ation, 0, 0, 0, 
1b3a0 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c  (char*)aPermute,
1b3b0 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20   P4_INTARRAY);. 
1b3c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b3d0 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
1b3e0 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64  , destA.iSdst, d
1b3f0 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64  estB.iSdst, nOrd
1b400 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b420 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c  char*)pKeyMerge,
1b430 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
1b440 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1b450 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45  eP5(v, OPFLAG_PE
1b460 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65  RMUTE);.  sqlite
1b470 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1b480 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42  P_Jump, addrAltB
1b490 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64 72  , addrAeqB, addr
1b4a0 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65 72  AgtB); VdbeCover
1b4b0 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75  age(v);..  /* Ju
1b4c0 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20 70  mp to the this p
1b4d0 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
1b4e0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   terminate the q
1b4f0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  uery..  */.  sql
1b500 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1b510 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64  abel(v, labelEnd
1b520 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
1b530 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
1b540 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  t columns.  */. 
1b550 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73   if( pDest->eDes
1b560 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
1b570 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69  .    Select *pFi
1b580 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  rst = pPrior;.  
1b590 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
1b5a0 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
1b5b0 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
1b5c0 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  r;.    generateC
1b5d0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
1b5e0 65 2c 20 70 46 69 72 73 74 2d 3e 70 53 72 63 2c  e, pFirst->pSrc,
1b5f0 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
1b600 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
1b610 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
1b620 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
1b630 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
1b640 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1b650 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
1b660 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
1b670 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
1b680 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1b690 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
1b6a0 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
1b6b0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
1b6c0 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
1b6d0 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
1b6e0 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
1b6f0 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
1b700 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
1b710 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
1b720 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
1b730 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d  **/.  explainCom
1b740 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
1b750 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
1b760 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  b2, 0);.  return
1b770 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21 3d 30   pParse->nErr!=0
1b780 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1b790 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1b7a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1b7b0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1b7c0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20  E_OMIT_VIEW)./* 
1b7d0 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61 74  Forward Declarat
1b7e0 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  ions */.static v
1b7f0 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69 73  oid substExprLis
1b800 74 28 50 61 72 73 65 2a 2c 20 45 78 70 72 4c 69  t(Parse*, ExprLi
1b810 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  st*, int, ExprLi
1b820 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1b830 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 50 61  d substSelect(Pa
1b840 72 73 65 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20  rse*, Select *, 
1b850 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20  int, ExprList*, 
1b860 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  int);../*.** Sca
1b870 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 78  n through the ex
1b880 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20  pression pExpr. 
1b890 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20 72   Replace every r
1b8a0 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61  eference to.** a
1b8b0 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
1b8c0 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20 77   number iTable w
1b8d0 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
1b8e0 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20  e iColumn-th.** 
1b8f0 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74 2e  entry in pEList.
1b900 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65 66    (But leave ref
1b910 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 52  erences to the R
1b920 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20  OWID column .** 
1b930 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a  unchanged.).**.*
1b940 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1b950 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 6c  s part of the fl
1b960 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64 75  attening procedu
1b970 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79 0a  re.  A subquery.
1b980 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74 20  ** whose result 
1b990 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
1b9a0 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72 73  y pEList appears
1b9b0 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65   as entry in the
1b9c0 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
1b9d0 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63 68  of a SELECT such
1b9e0 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 63   that the VDBE c
1b9f0 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
1ba00 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63  o that.** FORM c
1ba10 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20 69  lause entry is i
1ba20 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f 75  Table.  This rou
1ba30 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e 65  tine make the ne
1ba40 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e  cessary .** chan
1ba50 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f 20  ges to pExpr so 
1ba60 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20 64  that it refers d
1ba70 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 73  irectly to the s
1ba80 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f  ource table.** o
1ba90 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 72  f the subquery r
1baa0 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c 74  ather the result
1bab0 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62 71   set of the subq
1bac0 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uery..*/.static 
1bad0 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72 28  Expr *substExpr(
1bae0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1baf0 2c 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74  ,      /* Report
1bb00 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
1bb10 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
1bb20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
1bb30 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
1bb40 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ion occurs */.  
1bb50 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1bb60 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1bb70 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
1bb80 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
1bb90 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74  List    /* Subst
1bba0 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e  itute expression
1bbb0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
1bbc0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1bbd0 64 62 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  db;.  if( pExpr=
1bbe0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1bbf0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
1bc00 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
1bc10 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
1bc20 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
1bc30 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
1bc40 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
1bc50 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
1bc60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
1bc70 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
1bc80 45 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 45  Expr *pCopy = pE
1bc90 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
1bca0 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20  Column].pExpr;. 
1bcb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
1bcc0 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
1bcd0 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
1bce0 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
1bcf0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
1bd00 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
1bd10 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
1bd20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1bd30 45 78 70 72 49 73 56 65 63 74 6f 72 28 70 43 6f  ExprIsVector(pCo
1bd40 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  py) ){.        s
1bd50 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72 72 6f  qlite3VectorErro
1bd60 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 6f  rMsg(pParse, pCo
1bd70 70 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  py);.      }else
1bd80 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  {.        pNew =
1bd90 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1bda0 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20  db, pCopy, 0);. 
1bdb0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
1bdc0 26 26 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  && (pExpr->flags
1bdd0 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20   & EP_FromJoin) 
1bde0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
1bdf0 77 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  w->iRightJoinTab
1be00 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67  le = pExpr->iRig
1be10 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20  htJoinTable;.   
1be20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61         pNew->fla
1be30 67 73 20 7c 3d 20 45 50 5f 46 72 6f 6d 4a 6f 69  gs |= EP_FromJoi
1be40 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
1be50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1be60 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1be70 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1be80 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
1be90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1bea0 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1beb0 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 50 61   = substExpr(pPa
1bec0 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1bed0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
1bee0 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
1bef0 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
1bf00 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  r(pParse, pExpr-
1bf10 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c  >pRight, iTable,
1bf20 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66   pEList);.    if
1bf30 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
1bf40 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
1bf50 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
1bf60 73 75 62 73 74 53 65 6c 65 63 74 28 70 50 61 72  substSelect(pPar
1bf70 73 65 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  se, pExpr->x.pSe
1bf80 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  lect, iTable, pE
1bf90 4c 69 73 74 2c 20 31 29 3b 0a 20 20 20 20 7d 65  List, 1);.    }e
1bfa0 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73 74  lse{.      subst
1bfb0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
1bfc0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
1bfd0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
1bfe0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1bff0 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
1c000 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1c010 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
1c020 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1c030 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73  /* Report errors
1c040 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c   here */.  ExprL
1c050 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
1c060 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20  /* List to scan 
1c070 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20  and in which to 
1c080 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73  make substitutes
1c090 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1c0a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
1c0b0 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69  ble to be substi
1c0c0 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  tuted */.  ExprL
1c0d0 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20  ist *pEList     
1c0e0 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61  /* Substitute va
1c0f0 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lues */.){.  int
1c100 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1c110 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1c120 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1c130 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1c140 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1c150 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1c160 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
1c170 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
1c180 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
1c190 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1c1a0 62 73 74 53 65 6c 65 63 74 28 0a 20 20 50 61 72  bstSelect(.  Par
1c1b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1c1c0 20 20 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f    /* Report erro
1c1d0 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  rs here */.  Sel
1c1e0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1c1f0 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
1c200 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
1c210 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1c220 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
1c230 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
1c240 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65  * Table to be re
1c250 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72  placed */.  Expr
1c260 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
1c270 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
1c280 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64  alues */.  int d
1c290 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  oPrior          
1c2a0 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65  /* Do substitute
1c2b0 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74  s on p->pPrior t
1c2c0 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  oo */.){.  SrcLi
1c2d0 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75  st *pSrc;.  stru
1c2e0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c2f0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
1c300 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
1c310 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75  rn;.  do{.    su
1c320 62 73 74 45 78 70 72 4c 69 73 74 28 70 50 61 72  bstExprList(pPar
1c330 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69  se, p->pEList, i
1c340 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1c350 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1c360 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 47 72  t(pParse, p->pGr
1c370 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  oupBy, iTable, p
1c380 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73  EList);.    subs
1c390 74 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  tExprList(pParse
1c3a0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  , p->pOrderBy, i
1c3b0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1c3c0 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
1c3d0 20 73 75 62 73 74 45 78 70 72 28 70 50 61 72 73   substExpr(pPars
1c3e0 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  e, p->pHaving, i
1c3f0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
1c400 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
1c410 73 75 62 73 74 45 78 70 72 28 70 50 61 72 73 65  substExpr(pParse
1c420 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61  , p->pWhere, iTa
1c430 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
1c440 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1c450 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
1c460 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  rc!=0 );.    for
1c470 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
1c480 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
1c490 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1c4a0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1c4b0 65 63 74 28 70 50 61 72 73 65 2c 20 70 49 74 65  ect(pParse, pIte
1c4c0 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  m->pSelect, iTab
1c4d0 6c 65 2c 20 70 45 4c 69 73 74 2c 20 31 29 3b 0a  le, pEList, 1);.
1c4e0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1c4f0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
1c500 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78  .        substEx
1c510 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
1c520 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1c530 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  g, iTable, pELis
1c540 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1c550 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72  }.  }while( doPr
1c560 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70  ior && (p = p->p
1c570 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23  Prior)!=0 );.}.#
1c580 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1c590 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1c5a0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1c5b0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1c5c0 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
1c5d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1c5e0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1c5f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1c600 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
1c610 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1c620 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
1c630 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
1c640 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1c650 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
1c660 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1c670 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
1c680 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
1c690 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
1c6a0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
1c6b0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
1c6c0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
1c6d0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
1c6e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1c6f0 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
1c700 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
1c710 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
1c720 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1c730 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
1c740 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1c750 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
1c760 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
1c770 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
1c780 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
1c790 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
1c7a0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
1c7b0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1c7c0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
1c7d0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
1c7e0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
1c7f0 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
1c800 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
1c810 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
1c820 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
1c830 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
1c840 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
1c850 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
1c860 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1c870 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
1c880 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
1c890 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
1c8a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1c8b0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
1c8c0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
1c8d0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
1c8e0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
1c8f0 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
1c900 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1c910 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1c920 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1c930 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
1c940 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1c950 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
1c960 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76  mplification giv
1c970 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
1c980 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
1c990 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
1c9a0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
1c9b0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
1c9c0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
1c9d0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
1c9e0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
1c9f0 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
1ca00 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
1ca10 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
1ca20 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
1ca30 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
1ca40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1ca50 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
1ca60 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1ca70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1ca80 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
1ca90 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
1caa0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
1cab0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1cac0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1cad0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1cae0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1caf0 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  oin.**        an
1cb00 64 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72  d (2b) the outer
1cb10 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1cb20 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f  use subqueries o
1cb30 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1cb40 65 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d  e.**        FROM
1cb50 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1cb60 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69   that is a candi
1cb70 64 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e  date for flatten
1cb80 69 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20  ing.  (2b is.** 
1cb90 20 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69         due to ti
1cba0 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62  cket [2f7170d73b
1cbb0 66 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30  f9abf80] from 20
1cbc0 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1cbd0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
1cbe0 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
1cbf0 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1cc00 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
1cc10 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
1cc20 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
1cc30 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
1cc40 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
1cc50 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
1cc60 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1cc70 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
1cc80 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
1cc90 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
1cca0 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
1ccb0 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
1ccc0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
1ccd0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
1cce0 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
1ccf0 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
1cd00 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
1cd10 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
1cd20 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
1cd30 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
1cd40 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
1cd50 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
1cd60 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
1cd70 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
1cd80 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1cd90 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1cda0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1cdb0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1cdc0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1cdd0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1cde0 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
1cdf0 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
1ce00 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1ce10 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
1ce20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
1ce30 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
1ce40 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
1ce50 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1ce60 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1ce70 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1ce80 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1ce90 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1cea0 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1ceb0 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1cec0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
1ced0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1cee0 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1cef0 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1cf00 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1cf10 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
1cf20 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1cf30 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1cf40 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1cf50 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1cf60 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1cf70 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
1cf80 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
1cf90 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
1cfa0 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
1cfb0 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
1cfc0 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
1cfd0 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
1cfe0 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
1cff0 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
1d000 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  inal.**        t
1d010 65 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65  ext: "The subque
1d020 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1d030 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
1d040 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a  e outer query .*
1d050 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f  *        does no
1d060 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1d070 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1d080 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1d090 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1d0a0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
1d0b0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
1d0c0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
1d0d0 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
1d0e0 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
1d0f0 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
1d100 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
1d110 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
1d120 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
1d130 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
1d140 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
1d150 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
1d160 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
1d170 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1d180 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1d190 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
1d1a0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1d1b0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
1d1c0 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
1d1d0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
1d1e0 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1d1f0 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
1d200 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
1d210 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
1d220 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
1d230 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
1d240 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
1d250 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
1d260 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
1d270 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1d280 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1d290 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
1d2a0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
1d2b0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
1d2c0 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
1d2d0 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
1d2e0 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
1d2f0 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
1d300 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
1d310 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
1d320 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
1d330 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
1d340 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1d350 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
1d360 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
1d370 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
1d380 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
1d390 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
1d3a0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
1d3b0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
1d3c0 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
1d3d0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1d3e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1d3f0 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
1d400 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1d410 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
1d420 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1d430 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1d440 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
1d450 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
1d460 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
1d470 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1d480 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1d490 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1d4a0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1d4b0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1d4c0 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1d4d0 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1d4e0 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1d4f0 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1d500 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1d510 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1d520 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1d530 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1d540 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1d550 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1d560 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1d570 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1d580 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1d590 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1d5a0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1d5b0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1d5c0 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1d5d0 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1d5e0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1d5f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1d600 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1d610 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1d620 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1d630 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1d640 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1d650 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1d660 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1d670 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1d680 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1d690 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1d6a0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1d6b0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1d6c0 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1d6d0 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1d6e0 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1d6f0 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1d700 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1d710 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1d720 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1d730 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1d740 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1d750 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1d760 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1d770 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1d780 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1d790 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1d7a0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1d7b0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
1d7c0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1d7d0 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1d7e0 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1d7f0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1d800 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1d810 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
1d820 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1d830 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1d840 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d850 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
1d860 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
1d870 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
1d880 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
1d890 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1d8a0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1d8b0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
1d8c0 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
1d8d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1d8e0 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
1d8f0 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
1d900 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
1d910 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
1d920 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
1d930 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1d940 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1d950 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
1d960 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
1d970 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
1d980 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
1d990 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
1d9a0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
1d9b0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
1d9c0 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
1d9d0 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
1d9e0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
1d9f0 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1da00 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1da10 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1da20 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1da30 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
1da40 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
1da50 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
1da60 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75   (22)  The subqu
1da70 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ery is not a rec
1da80 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1da90 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72  *  (23)  The par
1daa0 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ent is not a rec
1dab0 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74  ursive CTE, or t
1dac0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1dad0 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  not a.**        
1dae0 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1daf0 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
1db00 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e   is because tran
1db10 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20  sforming the.** 
1db20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f         parent to
1db30 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1db40 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63  y confuses the c
1db50 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73  ode that handles
1db60 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72  .**        recur
1db70 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20  sive queries in 
1db80 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a  multiSelect()..*
1db90 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20  *.**  (24)  The 
1dba0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1dbb0 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
1dbc0 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
1dbd0 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
1dbe0 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
1dbf0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
1dc00 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
1dc10 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
1dc20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
1dc30 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
1dc40 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
1dc50 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
1dc60 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1dc70 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
1dc80 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
1dc90 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
1dca0 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
1dcb0 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
1dcc0 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
1dcd0 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
1dce0 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
1dcf0 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
1dd00 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
1dd10 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
1dd20 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1dd30 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
1dd40 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
1dd50 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
1dd60 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1dd70 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1dd80 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1dd90 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1dda0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
1ddb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ddc0 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
1ddd0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
1dde0 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
1ddf0 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
1de00 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
1de10 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
1de20 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
1de30 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
1de40 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
1de50 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
1de60 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
1de70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
1de80 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1de90 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
1dea0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
1deb0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
1dec0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ded0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1dee0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1def0 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
1df00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
1df10 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
1df20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1df30 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
1df40 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
1df50 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
1df60 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
1df70 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
1df80 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
1df90 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1dfa0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
1dfb0 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
1dfc0 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
1dfd0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1dfe0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1dff0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1e000 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
1e010 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
1e020 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
1e030 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20  lect *pParent;  
1e040 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49    /* Current UNI
1e050 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74  ON ALL term of t
1e060 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a  he other query *
1e070 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1e080 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
1e090 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
1e0a0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
1e0b0 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
1e0c0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1e0d0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
1e0e0 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
1e0f0 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1e100 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
1e110 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1e120 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e130 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1e140 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
1e150 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e160 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1e170 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1e180 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
1e190 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
1e1a0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1e1b0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1e1c0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1e1d0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1e1e0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1e1f0 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1e200 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1e210 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1e220 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
1e230 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1e240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e250 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1e260 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1e270 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
1e280 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
1e290 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
1e2a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1e2b0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
1e2c0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
1e2d0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1e2e0 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
1e2f0 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
1e300 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
1e310 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
1e320 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
1e330 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
1e340 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
1e350 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
1e360 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1e370 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
1e380 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30  ener) ) return 0
1e390 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1e3a0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1e3b0 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
1e3c0 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
1e3d0 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  rc );.  pSubitem
1e3e0 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
1e3f0 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20  m];.  iParent = 
1e400 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
1e410 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  r;.  pSub = pSub
1e420 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
1e430 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
1e440 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65   );.  if( subque
1e450 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ryIsAgg ){.    i
1e460 66 28 20 69 73 41 67 67 20 29 20 72 65 74 75 72  f( isAgg ) retur
1e470 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e4a0 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20 20  on (1)   */.    
1e4b0 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31  if( pSrc->nSrc>1
1e4c0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e4f0 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20 20  ion (2a)  */.   
1e500 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65 20   if( (p->pWhere 
1e510 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
1e520 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f  ty(p->pWhere,EP_
1e530 53 75 62 71 75 65 72 79 29 29 0a 20 20 20 20 20  Subquery)).     
1e540 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c  || (sqlite3ExprL
1e550 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69  istFlags(p->pELi
1e560 73 74 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  st) & EP_Subquer
1e570 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73  y)!=0.     || (s
1e580 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
1e590 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ags(p->pOrderBy)
1e5a0 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21   & EP_Subquery)!
1e5b0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1e5c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e600 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d  n (2b)  */.    }
1e610 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75 62  .  }.    .  pSub
1e620 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1e630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1e640 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1e650 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1e660 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1e670 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1e680 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1e690 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1e6a0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1e6b0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1e6c0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1e6d0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1e6e0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1e6f0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1e700 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1e710 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1e720 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1e730 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1e740 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1e750 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1e760 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1e770 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1e780 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1e790 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1e7a0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1e7b0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1e7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1e7d0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1e7e0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1e7f0 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1e820 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1e830 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1e840 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
1e850 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
1e860 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
1e870 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8a0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e8b0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
1e8c0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1e8d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8f0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e900 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
1e910 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1e920 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
1e930 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1e940 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1e950 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
1e960 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1e970 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
1e980 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
1e990 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1e9a0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e9b0 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
1e9c0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1e9d0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1e9e0 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
1e9f0 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1ea00 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ea10 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1ea20 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
1ea30 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1ea40 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1ea50 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
1ea60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea90 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1eaa0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1eab0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1eac0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1ead0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1eae0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1eaf0 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1eb00 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1eb10 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1eb20 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1eb30 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1eb40 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1eb50 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1eb60 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1eb70 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1eb80 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1eb90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1eba0 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1ebb0 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
1ebc0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1ebd0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
1ebe0 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1ebf0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1ec00 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69  MinMaxAgg );.  i
1ec10 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1ec20 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
1ec30 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20  e|SF_MinMaxAgg) 
1ec40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1ec50 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1ec60 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a   (22) and (24) *
1ec70 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1ec80 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1ec90 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1eca0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1ecb0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1ecc0 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f  triction (23) */
1ecd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  .  }..  /* OBSOL
1ece0 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
1ecf0 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1ed00 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
1ed10 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
1ed20 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1ed30 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
1ed40 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
1ed50 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1ed60 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
1ed70 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
1ed80 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
1ed90 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1eda0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1edb0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1edc0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
1edd0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1ede0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1edf0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1ee00 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1ee10 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1ee20 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
1ee30 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
1ee40 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
1ee50 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
1ee60 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
1ee70 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
1ee80 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
1ee90 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1eea0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1eeb0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
1eec0 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
1eed0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1eee0 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
1eef0 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
1ef00 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
1ef10 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
1ef20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1ef30 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1ef40 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
1ef50 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1ef60 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
1ef70 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1ef80 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1ef90 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1efa0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1efb0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1efc0 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
1efd0 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
1efe0 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
1eff0 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
1f000 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
1f010 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
1f020 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
1f030 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
1f040 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
1f050 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
1f060 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
1f070 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
1f080 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
1f090 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
1f0a0 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
1f0b0 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
1f0c0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1f0d0 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
1f0e0 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
1f0f0 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
1f100 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
1f110 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
1f120 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1f130 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
1f140 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1f150 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
1f160 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
1f170 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a   (pSubitem->fg.j
1f180 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1f190 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1f1a0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1f1b0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1f1c0 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1f1d0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1f1e0 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1f1f0 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1f200 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1f210 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1f220 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1f230 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1f240 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1f250 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1f260 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1f270 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1f280 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1f290 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1f2a0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1f2b0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1f2c0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f2d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f2e0 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1f2f0 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1f300 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1f310 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f320 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1f330 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1f340 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f350 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1f360 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1f370 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1f380 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1f390 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1f3a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1f3b0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1f3c0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1f3d0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1f3e0 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1f3f0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1f400 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1f410 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1f420 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1f430 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1f440 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
1f450 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69  sert( pSub->pELi
1f460 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31  st->nExpr==pSub1
1f470 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1f480 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1f490 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1f4a0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1f4b0 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1f4c0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1f4d0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1f4e0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1f4f0 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1f500 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1f510 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
1f520 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1f530 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f540 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1f550 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
1f560 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f570 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   18. */.    if( 
1f580 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1f590 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1f5a0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1f5b0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1f5c0 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1f5d0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1f5e0 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f  By->a[ii].u.x.iO
1f5f0 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72  rderByCol==0 ) r
1f600 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1f610 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f620 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
1f630 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
1f640 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1f650 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
1f660 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
1f670 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
1f680 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %s.%p from term 
1f690 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1f6a0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
1f6b0 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20  zSelName, pSub, 
1f6c0 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41  iFrom));..  /* A
1f6d0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
1f6e0 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
1f6f0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1f700 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
1f710 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
1f720 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
1f730 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1f740 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
1f750 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
1f760 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
1f770 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
1f780 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
1f790 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
1f7a0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
1f7b0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1f7c0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1f7d0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
1f7e0 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
1f7f0 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
1f800 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
1f810 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
1f820 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
1f830 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
1f840 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
1f850 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
1f860 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
1f870 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
1f880 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
1f890 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
1f8a0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
1f8b0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
1f8c0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
1f8d0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
1f8e0 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
1f8f0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
1f900 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
1f910 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1f920 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
1f930 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
1f940 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
1f950 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
1f960 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
1f970 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
1f980 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
1f990 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
1f9a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
1f9b0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
1f9c0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1f9d0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
1f9e0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
1f9f0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
1fa00 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1fa10 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
1fa20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
1fa30 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1fa40 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1fa50 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1fa60 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
1fa70 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1fa80 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
1fa90 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
1faa0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
1fab0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
1fac0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1fad0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
1fae0 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
1faf0 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
1fb00 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
1fb10 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1fb20 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1fb30 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
1fb40 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
1fb50 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1fb60 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1fb70 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
1fb80 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
1fb90 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
1fba0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
1fbb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
1fbc0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
1fbd0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1fbe0 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
1fbf0 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
1fc00 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
1fc10 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1fc20 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
1fc30 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
1fc40 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
1fc50 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1fc60 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
1fc70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78  ->pLimit;.    Ex
1fc80 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d  pr *pOffset = p-
1fc90 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65  >pOffset;.    Se
1fca0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
1fcb0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
1fcc0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1fcd0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
1fce0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1fcf0 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
1fd00 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66   = 0;.    p->pOf
1fd10 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
1fd20 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
1fd30 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
1fd40 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1fd50 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
1fd60 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  pSub->zSelName);
1fd70 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1fd80 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  = pOffset;.    p
1fd90 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
1fda0 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
1fdb0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1fdc0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
1fdd0 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
1fde0 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70  K_ALL;.    if( p
1fdf0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1fe00 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1fe10 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
1fe20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
1fe30 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1fe40 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
1fe50 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1fe60 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  New;.      pNew-
1fe70 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
1fe80 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
1fe90 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ew;.      SELECT
1fea0 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70  TRACE(2,pParse,p
1feb0 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d  ,.         ("com
1fec0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1fed0 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73  lattener creates
1fee0 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e   %s.%p as peer\n
1fef0 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77  ",.         pNew
1ff00 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77  ->zSelName, pNew
1ff10 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
1ff20 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1ff30 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1ff40 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
1ff50 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
1ff60 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
1ff70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ff80 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
1ff90 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
1ffa0 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
1ffb0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1ffc0 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
1ffd0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
1ffe0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
1fff0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20000 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
20010 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
20020 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
20030 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
20040 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20050 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
20060 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
20070 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
20080 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
20090 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
200a0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
200b0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
200c0 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
200d0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
200e0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
200f0 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
20100 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
20110 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
20120 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
20130 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
20140 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
20150 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
20160 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
20170 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
20180 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
20190 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
201a0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
201b0 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
201c0 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
201d0 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
201e0 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
201f0 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
20200 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
20210 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
20220 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
20230 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
20240 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
20250 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
20260 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
20270 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
20280 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d  ToDel->nTabRef==
20290 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
202a0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
202b0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
202c0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
202d0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
202e0 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
202f0 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
20300 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
20310 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
20320 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
20330 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
20340 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d  ToDel->nTabRef--
20350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
20360 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
20370 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
20380 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
20390 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
203a0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
203b0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
203c0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
203d0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
203e0 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
203f0 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
20400 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
20410 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
20420 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
20430 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
20440 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
20450 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
20460 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
20470 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
20480 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
20490 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
204a0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
204b0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
204c0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
204d0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
204e0 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
204f0 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
20500 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
20510 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
20520 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
20530 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
20540 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
20550 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
20560 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
20570 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
20580 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
20590 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
205a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
205b0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
205c0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
205d0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
205e0 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
205f0 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
20600 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
20610 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
20620 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
20630 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
20640 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
20650 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
20660 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
20670 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
20680 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
20690 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
206a0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
206b0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
206c0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
206d0 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
206e0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
206f0 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
20700 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
20710 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
20720 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
20730 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
20740 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
20750 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
20760 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
20770 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20780 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
20790 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
207a0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
207b0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
207c0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
207d0 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
207e0 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66  pe = pSubitem->f
207f0 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
20800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
20810 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
20820 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
20830 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
20840 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
20850 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
20860 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
20870 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
20880 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
20890 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
208a0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
208b0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
208c0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
208d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
208e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
208f0 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
20900 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
20910 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
20920 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
20930 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
20940 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
20950 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
20960 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
20970 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
20980 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
20990 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
209a0 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
209b0 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
209c0 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
209d0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
209e0 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
209f0 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
20a00 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
20a10 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
20a20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
20a30 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
20a40 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
20a50 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
20a60 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
20a70 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
20a80 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
20a90 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
20aa0 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
20ab0 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
20ac0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
20ad0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
20ae0 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
20af0 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
20b00 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
20b10 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
20b20 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
20b30 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
20b40 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
20b50 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
20b60 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
20b70 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
20b80 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
20b90 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
20ba0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
20bb0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
20bc0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
20bd0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
20be0 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
20bf0 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
20c00 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
20c10 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
20c20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20c30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
20c40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
20c50 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
20c60 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
20c70 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
20c80 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
20c90 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
20ca0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
20cb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
20cc0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
20cd0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
20ce0 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
20cf0 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
20d00 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
20d10 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
20d20 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
20d30 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
20d40 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
20d50 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
20d60 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
20d70 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
20d80 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
20d90 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
20da0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
20db0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
20dc0 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
20dd0 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
20de0 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
20df0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
20e00 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
20e10 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
20e20 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
20e30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20e40 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
20e50 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
20e60 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
20e70 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
20e80 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
20e90 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
20ea0 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
20eb0 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20ed0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
20ee0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
20ef0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
20f00 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
20f10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
20f20 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
20f30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
20f40 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
20f50 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
20f60 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
20f70 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
20f80 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
20f90 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
20fa0 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
20fb0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
20fc0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
20fd0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
20fe0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
20ff0 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
21000 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
21010 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
21020 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
21030 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
21040 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
21050 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21060 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
21070 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
21080 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
21090 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pan);.        sq
210a0 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
210b0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  me);.        pLi
210c0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
210d0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a   zName;.      }.
210e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
210f0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
21100 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
21110 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
21120 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
21130 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
21140 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
21150 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
21160 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
21170 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
21180 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
21190 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
211a0 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
211b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
211c0 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
211d0 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
211e0 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
211f0 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
21200 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
21210 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
21220 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
21230 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
21240 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
21250 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21260 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
21270 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
21280 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
21290 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
212a0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
212b0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
212c0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
212d0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
212e0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
212f0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
21300 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
21310 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
21320 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
21330 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
21340 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
21350 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
21360 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
21370 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
21380 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
21390 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
213a0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
213b0 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
213c0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
213d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
213e0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
213f0 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
21400 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
21410 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21420 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
21430 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
21440 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f  ert( pSub->pPrio
21450 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  r==0 );.      pP
21460 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
21470 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
21480 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
21490 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
214a0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
214b0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
214c0 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
214d0 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
214e0 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Agg ){.      ass
214f0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48  ert( pParent->pH
21500 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
21510 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
21520 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57  ng = pParent->pW
21530 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
21540 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  ent->pWhere = pW
21550 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
21560 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
21570 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
21580 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
21590 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
215a0 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30  pSub->pHaving, 0
215b0 29 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  ), pParent->pHav
215c0 69 6e 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ing.      );.   
215d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
215e0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
215f0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
21600 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
21610 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
21620 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
21630 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
21640 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
21650 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
21660 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57  e3ExprAnd(db, pW
21670 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70  here, pParent->p
21680 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
21690 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
216a0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
216b0 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 70     substSelect(p
216c0 50 61 72 73 65 2c 20 70 50 61 72 65 6e 74 2c 20  Parse, pParent, 
216d0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
216e0 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 7d  EList, 0);.    }
216f0 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  .  .    /* The f
21700 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20 69  lattened query i
21710 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65 69  s distinct if ei
21720 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f  ther the inner o
21730 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  r the.    ** out
21740 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73 74  er query is dist
21750 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  inct. .    */.  
21760 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c    pParent->selFl
21770 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c  ags |= pSub->sel
21780 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
21790 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20  nct;.  .    /*. 
217a0 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e     ** SELECT ...
217b0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
217c0 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54  . LIMIT a OFFSET
217d0 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53   b) LIMIT x OFFS
217e0 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ET y;.    **.   
217f0 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74   ** One is tempt
21800 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64  ed to try to add
21810 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62   a and b to comb
21820 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20  ine the limits. 
21830 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a   But this.    **
21840 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69   does not work i
21850 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69  f either limit i
21860 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20  s negative..    
21870 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
21880 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >pLimit ){.     
21890 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74   pParent->pLimit
218a0 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b   = pSub->pLimit;
218b0 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69  .      pSub->pLi
218c0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  mit = 0;.    }. 
218d0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c   }..  /* Finiall
218e0 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20 69  y, delete what i
218f0 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75  s left of the su
21900 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75 72  bquery and retur
21910 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a  n.  ** success..
21920 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65    */.  sqlite3Se
21930 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
21940 53 75 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45  Sub1);..#if SELE
21950 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
21960 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
21970 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
21980 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
21990 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
219a0 2c 70 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74  ,p,("After flatt
219b0 65 6e 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20  ening:\n"));.   
219c0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
219d0 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
219e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
219f0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
21a00 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
21a10 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
21a20 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
21a30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
21a40 29 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66  ) */....#if !def
21a50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
21a60 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
21a70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
21a80 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d  IT_VIEW)./*.** M
21a90 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65  ake copies of re
21aa0 6c 65 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61  levant WHERE cla
21ab0 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
21ac0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 6e 74   outer query int
21ad0 6f 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  o.** the WHERE c
21ae0 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
21af0 79 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  y.  Example:.**.
21b00 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
21b10 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53  ROM (SELECT a AS
21b20 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f   x, c-d AS y FRO
21b30 4d 20 74 31 29 20 57 48 45 52 45 20 78 3d 35 20  M t1) WHERE x=5 
21b40 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20  AND y=10;.**.** 
21b50 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
21b60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
21b70 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
21b80 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
21b90 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
21ba0 61 3d 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a  a=5 AND c-d=10).
21bb0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 78 3d 35  **     WHERE x=5
21bc0 20 41 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a   AND y=10;.**.**
21bd0 20 54 68 65 20 68 6f 70 65 20 69 73 20 74 68 61   The hope is tha
21be0 74 20 74 68 65 20 74 65 72 6d 73 20 61 64 64 65  t the terms adde
21bf0 64 20 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71  d to the inner q
21c00 75 65 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69  uery will make i
21c10 74 20 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69  t more.** effici
21c20 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f  ent..**.** Do no
21c30 74 20 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f  t attempt this o
21c40 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a  ptimization if:.
21c50 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 20  **.**   (1) The 
21c60 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 61  inner query is a
21c70 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 28 49  n aggregate.  (I
21c80 6e 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 27  n that case, we'
21c90 64 20 72 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a  d really want.**
21ca0 20 20 20 20 20 20 20 74 6f 20 63 6f 70 79 20 74         to copy t
21cb0 68 65 20 6f 75 74 65 72 20 57 48 45 52 45 2d 63  he outer WHERE-c
21cc0 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f  lause terms onto
21cd0 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
21ce0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  se of the.**    
21cf0 20 20 20 69 6e 6e 65 72 20 71 75 65 72 79 2e 20     inner query. 
21d00 20 42 75 74 20 74 68 65 79 20 70 72 6f 62 61 62   But they probab
21d10 6c 79 20 77 6f 6e 27 74 20 68 65 6c 70 20 74 68  ly won't help th
21d20 65 72 65 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f  ere so do not bo
21d30 74 68 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  ther.).**.**   (
21d40 32 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  2) The inner que
21d50 72 79 20 69 73 20 74 68 65 20 72 65 63 75 72 73  ry is the recurs
21d60 69 76 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f  ive part of a co
21d70 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65  mmon table expre
21d80 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  ssion..**.**   (
21d90 33 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  3) The inner que
21da0 72 79 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63  ry has a LIMIT c
21db0 6c 61 75 73 65 20 28 73 69 6e 63 65 20 74 68 65  lause (since the
21dc0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
21dd0 57 48 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63  WHERE.**       c
21de0 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67  lose would chang
21df0 65 20 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66  e the meaning of
21e00 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a   the LIMIT)..**.
21e10 2a 2a 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e  **   (4) The inn
21e20 65 72 20 71 75 65 72 79 20 69 73 20 74 68 65 20  er query is the 
21e30 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
21e40 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28   a LEFT JOIN.  (
21e50 54 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20  The caller.**   
21e60 20 20 20 20 65 6e 66 6f 72 63 65 73 20 74 68 69      enforces thi
21e70 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 69  s restriction si
21e80 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
21e90 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 65   does not have e
21ea0 6e 6f 75 67 68 0a 2a 2a 20 20 20 20 20 20 20 69  nough.**       i
21eb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e  nformation to kn
21ec0 6f 77 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29  ow.).**.**   (5)
21ed0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
21ee0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
21ef0 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f  ginates in the O
21f00 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
21f10 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20  e.**       of a 
21f20 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a  LEFT JOIN..**.**
21f30 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
21f40 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
21f50 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66   and non-zero if
21f60 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45   one or more WHE
21f70 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72  RE clause.** ter
21f80 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ms are duplicate
21f90 64 20 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75  d into the subqu
21fa0 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
21fb0 6e 74 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  nt pushDownWhere
21fc0 54 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a  Terms(.  Parse *
21fd0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
21fe0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
21ff0 28 66 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  (for malloc() an
22000 64 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e  d error reportin
22010 67 29 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  g) */.  Select *
22020 70 53 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a  pSubq,        /*
22030 20 54 68 65 20 73 75 62 71 75 65 72 79 20 77 68   The subquery wh
22040 6f 73 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ose WHERE clause
22050 20 69 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e   is to be augmen
22060 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ted */.  Expr *p
22070 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
22080 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
22090 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
220a0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
220b0 43 75 72 73 6f 72 20 20 20 20 20 20 20 20 20 20  Cursor          
220c0 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
220d0 72 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  r of the subquer
220e0 79 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  y */.){.  Expr *
220f0 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e  pNew;.  int nChn
22100 67 20 3d 20 30 3b 0a 20 20 53 65 6c 65 63 74 20  g = 0;.  Select 
22110 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *pX;           /
22120 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
22130 65 72 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  er compound SELE
22140 43 54 73 20 69 6e 20 70 53 75 62 71 20 2a 2f 0a  CTs in pSubq */.
22150 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d 30 20    if( pWhere==0 
22160 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
22170 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20  r(pX=pSubq; pX; 
22180 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a  pX=pX->pPrior){.
22190 20 20 20 20 69 66 28 20 28 70 58 2d 3e 73 65 6c      if( (pX->sel
221a0 46 6c 61 67 73 20 26 20 28 53 46 5f 41 67 67 72  Flags & (SF_Aggr
221b0 65 67 61 74 65 7c 53 46 5f 52 65 63 75 72 73 69  egate|SF_Recursi
221c0 76 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ve))!=0 ){.     
221d0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73   testcase( pX->s
221e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
221f0 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
22200 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 73 65  testcase( pX->se
22210 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
22220 72 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20 74  rsive );.      t
22230 65 73 74 63 61 73 65 28 20 70 58 21 3d 70 53 75  estcase( pX!=pSu
22240 62 71 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  bq );.      retu
22250 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63  rn 0; /* restric
22260 74 69 6f 6e 73 20 28 31 29 20 61 6e 64 20 28 32  tions (1) and (2
22270 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ) */.    }.  }. 
22280 20 69 66 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d   if( pSubq->pLim
22290 69 74 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  it!=0 ){.    ret
222a0 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
222b0 63 74 69 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d  ction (3) */.  }
222c0 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72 65  .  while( pWhere
222d0 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a  ->op==TK_AND ){.
222e0 20 20 20 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73      nChng += pus
222f0 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28  hDownWhereTerms(
22300 70 50 61 72 73 65 2c 20 70 53 75 62 71 2c 20 70  pParse, pSubq, p
22310 57 68 65 72 65 2d 3e 70 52 69 67 68 74 2c 20 69  Where->pRight, i
22320 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 57 68  Cursor);.    pWh
22330 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
22340 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45  eft;.  }.  if( E
22350 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
22360 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69  Where,EP_FromJoi
22370 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 2f  n) ) return 0; /
22380 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 35 20  * restriction 5 
22390 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
223a0 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
223b0 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72  ant(pWhere, iCur
223c0 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e  sor) ){.    nChn
223d0 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g++;.    while( 
223e0 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 70  pSubq ){.      p
223f0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
22400 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
22410 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20   pWhere, 0);.   
22420 20 20 20 70 4e 65 77 20 3d 20 73 75 62 73 74 45     pNew = substE
22430 78 70 72 28 70 50 61 72 73 65 2c 20 70 4e 65 77  xpr(pParse, pNew
22440 2c 20 69 43 75 72 73 6f 72 2c 20 70 53 75 62 71  , iCursor, pSubq
22450 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
22460 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d   pSubq->pWhere =
22470 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
22480 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
22490 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
224a0 3b 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20  ;.      pSubq = 
224b0 70 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20  pSubq->pPrior;. 
224c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
224d0 6e 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69  n nChng;.}.#endi
224e0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
224f0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
22500 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
22510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
22520 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65  ) */../*.** Base
22530 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
22540 73 20 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f  s of the AggInfo
22550 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63   structure indic
22560 61 74 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ated by the firs
22570 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74  t.** argument, t
22580 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
22590 63 6b 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  cks if the follo
225a0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
225b0 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75  *.**    * the qu
225c0 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73  ery contains jus
225d0 74 20 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65  t a single aggre
225e0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a  gate function,.*
225f0 2a 20 20 20 20 2a 20 74 68 65 20 61 67 67 72 65  *    * the aggre
22600 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73  gate function is
22610 20 65 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72   either min() or
22620 20 6d 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20   max(), and.**  
22630 20 20 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74    * the argument
22640 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
22650 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  e function is a 
22660 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a  column value..**
22670 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68  .** If all of th
22680 65 20 61 62 6f 76 65 20 61 72 65 20 74 72 75 65  e above are true
22690 2c 20 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44  , then WHERE_ORD
226a0 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52  ERBY_MIN or WHER
226b0 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a  E_ORDERBY_MAX.**
226c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
226d0 61 70 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73  appropriate. Als
226e0 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20  o, *ppMinMax is 
226f0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
22700 74 68 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  the .** list of 
22710 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
22720 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
22730 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
22740 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  ng..**.** Or, if
22750 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
22760 61 62 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65  above are not me
22770 74 2c 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20  t, *ppMinMax is 
22780 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20  set to 0 and.** 
22790 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
227a0 52 4d 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64  RMAL is returned
227b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d  ..*/.static u8 m
227c0 69 6e 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e  inMaxQuery(AggIn
227d0 66 6f 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78  fo *pAggInfo, Ex
227e0 70 72 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61  prList **ppMinMa
227f0 78 29 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d  x){.  int eRet =
22800 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
22810 4f 52 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20  ORMAL;          
22820 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
22830 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20  */..  *ppMinMax 
22840 3d 20 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49  = 0;.  if( pAggI
22850 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b  nfo->nFunc==1 ){
22860 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
22870 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75   = pAggInfo->aFu
22880 6e 63 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20  nc[0].pExpr; /* 
22890 41 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  Aggregate functi
228a0 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  on */.    ExprLi
228b0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78  st *pEList = pEx
228c0 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20  pr->x.pList;    
228d0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
228e0 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a  o agg function *
228f0 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  /..    assert( p
22900 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
22910 5f 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20  _FUNCTION );.   
22920 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
22930 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20  EList->nExpr==1 
22940 26 26 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  && pEList->a[0].
22950 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47  pExpr->op==TK_AG
22960 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
22970 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
22980 75 6e 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  unc = pExpr->u.z
22990 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28  Token;.      if(
229a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
229b0 7a 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30  zFunc, "min")==0
229c0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74   ){.        eRet
229d0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
229e0 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70  _MIN;.        *p
229f0 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74  pMinMax = pEList
22a00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
22a10 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
22a20 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d  (zFunc, "max")==
22a30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65  0 ){.        eRe
22a40 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  t = WHERE_ORDERB
22a50 59 5f 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a  Y_MAX;.        *
22a60 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73  ppMinMax = pELis
22a70 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
22a80 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
22a90 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  *ppMinMax==0 || 
22aa0 28 2a 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78  (*ppMinMax)->nEx
22ab0 70 72 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  pr==1 );.  retur
22ac0 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
22ad0 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
22ae0 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
22af0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
22b00 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
22b10 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
22b20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
22b30 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
22b40 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
22b50 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
22b60 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
22b70 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
22b80 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
22b90 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
22ba0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
22bb0 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
22bc0 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
22bd0 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
22be0 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
22bf0 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
22c00 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
22c10 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
22c20 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
22c30 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
22c40 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
22c50 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
22c60 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
22c70 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
22c80 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
22c90 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
22ca0 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
22cb0 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
22cc0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
22cd0 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
22ce0 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
22cf0 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
22d00 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
22d10 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
22d20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
22d30 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
22d40 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
22d50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
22d60 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
22d70 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
22d80 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
22d90 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
22da0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
22db0 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
22dc0 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
22dd0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
22de0 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
22df0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
22e00 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
22e10 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
22e20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
22e30 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
22e40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22e50 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
22e60 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
22e70 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
22e80 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
22e90 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
22ea0 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
22eb0 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
22ec0 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
22ed0 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
22ee0 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
22ef0 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
22f00 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
22f10 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
22f20 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
22f30 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
22f40 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
22f50 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
22f60 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
22f70 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
22f80 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
22f90 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
22fa0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
22fb0 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
22fc0 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
22fd0 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
22fe0 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
22ff0 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
23000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23010 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
23020 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
23030 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23040 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
23050 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
23060 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
23070 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e  & pFrom->fg.isIn
23080 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54  dexedBy ){.    T
23090 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
230a0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
230b0 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d  ar *zIndexedBy =
230c0 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pFrom->u1.zInde
230d0 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78  xedBy;.    Index
230e0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
230f0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
23100 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
23110 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
23120 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
23130 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20  zIndexedBy); .  
23140 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
23150 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
23160 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
23170 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23180 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
23190 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
231a0 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29  , zIndexedBy, 0)
231b0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
231c0 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
231d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
231e0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
231f0 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42  }.    pFrom->pIB
23200 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
23210 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
23220 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
23230 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
23240 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
23250 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
23260 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
23270 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
23280 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
23290 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
232a0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
232b0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
232c0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
232d0 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
232e0 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
232f0 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
23300 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
23310 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
23320 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
23330 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
23340 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
23350 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
23360 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
23370 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
23380 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
23390 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
233a0 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
233b0 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
233c0 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
233d0 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
233e0 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
233f0 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
23400 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
23410 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
23420 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
23430 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
23440 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
23450 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
23460 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
23470 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
23480 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
23490 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
234a0 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
234b0 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
234c0 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
234d0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
234e0 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
234f0 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
23500 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
23510 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
23520 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
23530 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
23540 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
23550 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
23560 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
23570 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
23580 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
23590 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
235a0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
235b0 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
235c0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
235d0 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
235e0 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
235f0 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
23600 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
23610 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
23620 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
23630 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
23640 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
23650 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
23660 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
23670 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23680 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
23690 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
236a0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
236b0 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
236c0 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
236d0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
236e0 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
236f0 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
23700 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
23710 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
23720 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
23730 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
23740 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
23750 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
23760 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
23770 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
23780 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
23790 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
237a0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
237b0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
237c0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
237d0 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
237e0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
237f0 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
23800 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
23810 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
23820 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
23830 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
23840 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
23850 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
23860 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
23870 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
23880 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
23890 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
238a0 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
238b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
238c0 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
238d0 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
238e0 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
238f0 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
23900 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
23910 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
23920 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
23930 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
23940 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
23950 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
23960 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
23970 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29   TK_ASTERISK, 0)
23980 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
23990 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
239a0 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
239b0 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
239c0 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
239d0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
239e0 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
239f0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
23a00 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
23a10 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  pWith = 0;.  p->
23a20 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
23a30 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
23a40 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
23a50 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29   & SF_Converted)
23a60 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
23a70 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65  lags |= SF_Conve
23a80 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  rted;.  assert( 
23a90 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
23aa0 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
23ab0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
23ac0 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
23ad0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  = 0;.  pNew->pOf
23ae0 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  fset = 0;.  retu
23af0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
23b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
23b10 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 46 52  to see if the FR
23b20 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
23b30 46 72 6f 6d 20 68 61 73 20 74 61 62 6c 65 2d 76  From has table-v
23b40 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a  alued function.*
23b50 2a 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 66  * arguments.  If
23b60 20 69 74 20 64 6f 65 73 2c 20 6c 65 61 76 65 20   it does, leave 
23b70 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
23b80 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
23b90 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
23ba0 6f 2c 20 73 69 6e 63 65 20 70 46 72 6f 6d 20 69  o, since pFrom i
23bb0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
23bc0 20 62 65 20 61 20 74 61 62 6c 65 2d 76 61 6c 75   be a table-valu
23bd0 65 64 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed function..*/.
23be0 73 74 61 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f  static int canno
23bf0 74 42 65 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  tBeFunction(Pars
23c00 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
23c10 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
23c20 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
23c30 72 6f 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  rom->fg.isTabFun
23c40 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
23c50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23c60 20 22 27 25 73 27 20 69 73 20 6e 6f 74 20 61 20   "'%s' is not a 
23c70 66 75 6e 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d  function", pFrom
23c80 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
23c90 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
23ca0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64  turn 0;.}..#ifnd
23cb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
23cc0 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  TE./*.** Argumen
23cd0 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20 6d  t pWith (which m
23ce0 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e  ay be NULL) poin
23cf0 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c  ts to a linked l
23d00 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a  ist of nested .*
23d10 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c  * WITH contexts,
23d20 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f   from inner to o
23d30 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65  utermost. If the
23d40 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
23d50 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c  d by .** FROM cl
23d60 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74  ause element pIt
23d70 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63  em is really a c
23d80 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72  ommon-table-expr
23d90 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a  ession (CTE) .**
23da0 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
23db0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54  ointer to the CT
23dc0 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72  E definition for
23dd0 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68   that table. Oth
23de0 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e  erwise.** return
23df0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
23e00 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
23e10 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65   is returned, se
23e20 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20  t *ppContext to 
23e30 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74  point to the Wit
23e40 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  h.** object that
23e50 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43 54   the returned CT
23e60 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f  E belongs to..*/
23e70 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 43  .static struct C
23e80 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a  te *searchWith(.
23e90 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e    /* Current inn
23ec0 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  ermost WITH clau
23ed0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
23ee0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
23ef0 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  em,     /* FROM 
23f00 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74  clause element t
23f10 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57  o resolve */.  W
23f20 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20  ith **ppContext 
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f40 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75  * OUT: WITH clau
23f50 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  se return value 
23f60 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b  belongs to */.){
23f70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23f80 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65  Name;.  if( pIte
23f90 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
23fa0 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65  && (zName = pIte
23fb0 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  m->zName)!=0 ){.
23fc0 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20      With *p;.   
23fd0 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b   for(p=pWith; p;
23fe0 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20   p=p->pOuter){. 
23ff0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
24000 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
24010 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
24020 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
24030 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d  trICmp(zName, p-
24040 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
24050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  ){.          *pp
24060 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20  Context = p;.   
24070 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70         return &p
24080 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
24090 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
240a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
240b0 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67  }../* The code g
240c0 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69  enerator maintai
240d0 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63  ns a stack of ac
240e0 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65  tive WITH clause
240f0 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  s.** with the in
24100 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c  ner-most WITH cl
24110 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68  ause being at th
24120 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
24130 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
24140 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74 68  outine pushes th
24150 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70 61  e WITH clause pa
24160 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
24170 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f  nd argument.** o
24180 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74  nto the top of t
24190 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67  he stack. If arg
241a0 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20 74  ument bFree is t
241b0 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a  rue, then this.*
241c0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77 69  * WITH clause wi
241d0 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70  ll never be popp
241e0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
241f0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
24200 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20  it.** should be 
24210 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  freed along with
24220 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
24230 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65  t. In other case
24240 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65  s, when.** bFree
24250 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62  ==0, the With ob
24260 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65  ject will be fre
24270 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
24280 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61  e SELECT .** sta
24290 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63  tement with whic
242a0 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74  h it is associat
242b0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
242c0 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72 73  te3WithPush(Pars
242d0 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20  e *pParse, With 
242e0 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65 65  *pWith, u8 bFree
242f0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46 72  ){.  assert( bFr
24300 65 65 3d 3d 30 20 7c 7c 20 28 70 50 61 72 73 65  ee==0 || (pParse
24310 2d 3e 70 57 69 74 68 3d 3d 30 20 26 26 20 70 50  ->pWith==0 && pP
24320 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46 72 65  arse->pWithToFre
24330 65 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  e==0) );.  if( p
24340 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73 73 65  With ){.    asse
24350 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
24360 68 21 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h!=pWith );.    
24370 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20  pWith->pOuter = 
24380 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
24390 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
243a0 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66   = pWith;.    if
243b0 28 20 62 46 72 65 65 20 29 20 70 50 61 72 73 65  ( bFree ) pParse
243c0 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 20 3d 20  ->pWithToFree = 
243d0 70 57 69 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pWith;.  }.}../*
243e0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
243f0 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
24400 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
24410 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
24420 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
24430 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
24440 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
24450 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
24460 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
24470 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
24480 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
24490 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
244a0 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
244b0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
244c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
244d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
244e0 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
244f0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
24500 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
24510 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
24520 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
24530 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
24540 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
24550 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
24560 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
24570 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
24580 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
24590 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
245a0 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
245b0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
245c0 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
245d0 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
245e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
245f0 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
24600 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
24610 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
24620 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
24630 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
24640 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
24650 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
24660 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
24670 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
24680 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
24690 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
246a0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
246b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
246c0 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
246d0 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
246e0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
246f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
24700 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
24710 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24730 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
24740 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
24750 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
24760 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
24770 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
24780 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
24790 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
247a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
247b0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
247c0 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
247d0 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
247e0 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
247f0 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
24800 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
24810 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
24820 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
24830 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
24840 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
24850 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
24860 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
24870 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
24880 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
24890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
248a0 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
248b0 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
248c0 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
248d0 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
248e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
248f0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
24900 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
24910 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
24920 3e 7a 43 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d  >zCteErr is non-
24930 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
24940 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
24950 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
24960 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
24970 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
24980 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
24990 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
249a0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
249b0 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
249c0 43 74 65 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  CteErr is NULL, 
249d0 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
249e0 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
249f0 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
24a00 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
24a10 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
24a20 28 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20  ( pCte->zCteErr 
24a30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24a40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
24a50 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20   pCte->zCteErr, 
24a60 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
24a70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24a80 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
24a90 20 20 20 69 66 28 20 63 61 6e 6e 6f 74 42 65 46     if( cannotBeF
24aa0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
24ab0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
24ac0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
24ad0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
24ae0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
24af0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
24b00 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
24b10 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
24b20 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
24b30 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
24b40 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
24b50 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62  ;.    pTab->nTab
24b60 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 54 61  Ref = 1;.    pTa
24b70 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  b->zName = sqlit
24b80 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
24b90 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
24ba0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
24bb0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f  1;.    pTab->nRo
24bc0 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61  wLogEst = 200; a
24bd0 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69  ssert( 200==sqli
24be0 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37  te3LogEst(104857
24bf0 36 29 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e  6) );.    pTab->
24c00 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45  tabFlags |= TF_E
24c10 70 68 65 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f  phemeral | TF_No
24c20 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
24c30 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
24c40 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
24c50 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
24c60 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
24c70 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
24c80 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
24c90 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
24ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
24cb0 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  m->pSelect );.. 
24cc0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
24cd0 68 69 73 20 69 73 20 61 20 72 65 63 75 72 73 69  his is a recursi
24ce0 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70  ve CTE. */.    p
24cf0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
24d00 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65  lect;.    bMayRe
24d10 63 75 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c  cursive = ( pSel
24d20 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
24d30 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  pSel->op==TK_UNI
24d40 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  ON );.    if( bM
24d50 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
24d60 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
24d70 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
24d80 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
24d90 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f  ->pSrc;.      fo
24da0 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e  r(i=0; i<pSrc->n
24db0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
24dc0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
24dd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
24de0 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pSrc->a[i];.   
24df0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
24e00 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20  zDatabase==0 .  
24e10 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d         && pItem-
24e20 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20  >zName!=0 .     
24e30 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
24e40 33 53 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e  3StrICmp(pItem->
24e50 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61  zName, pCte->zNa
24e60 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  me).          ){
24e70 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
24e80 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
24e90 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
24ea0 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20 3d  fg.isRecursive =
24eb0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
24ec0 61 62 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20  ab->nTabRef++;. 
24ed0 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
24ee0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
24ef0 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
24f00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24f10 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
24f20 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
24f30 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
24f40 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
24f50 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20  pTab->nTabRef>2 
24f60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24f70 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
24f80 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
24f90 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
24fa0 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
24fb0 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
24fc0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
24fd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24fe0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
24ff0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
25000 2d 3e 6e 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20  ->nTabRef==1 || 
25010 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ((pSel->selFlags
25020 26 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26  &SF_Recursive) &
25030 26 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d  & pTab->nTabRef=
25040 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65  =2 ));..    pCte
25050 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 63 69 72  ->zCteErr = "cir
25060 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65 3a  cular reference:
25070 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65 64   %s";.    pSaved
25080 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e 70  With = pParse->p
25090 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65  With;.    pParse
250a0 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b  ->pWith = pWith;
250b0 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
250c0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
250d0 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d  Select *pPrior =
250e0 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
250f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
25100 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b  ior->pWith==0 );
25110 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
25120 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e 70 57 69  With = pSel->pWi
25130 74 68 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  th;.      sqlite
25140 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
25150 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b 0a 20 20  ker, pPrior);.  
25160 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 57 69 74      pPrior->pWit
25170 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  h = 0;.    }else
25180 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  {.      sqlite3W
25190 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
251a0 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
251b0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
251c0 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20 20 20 20  h = pWith;..    
251d0 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20  for(pLeft=pSel; 
251e0 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70  pLeft->pPrior; p
251f0 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69  Left=pLeft->pPri
25200 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  or);.    pEList 
25210 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b  = pLeft->pEList;
25220 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70  .    if( pCte->p
25230 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66  Cols ){.      if
25240 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69  ( pEList && pELi
25250 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d  st->nExpr!=pCte-
25260 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b  >pCols->nExpr ){
25270 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25280 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
25290 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 25   "table %s has %
252a0 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25 64 20  d values for %d 
252b0 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20  columns",.      
252c0 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d        pCte->zNam
252d0 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  e, pEList->nExpr
252e0 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e  , pCte->pCols->n
252f0 45 78 70 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  Expr.        );.
25300 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
25310 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57 69  pWith = pSavedWi
25320 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  th;.        retu
25330 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
25340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
25350 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e 70 43  EList = pCte->pC
25360 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ols;.    }..    
25370 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72  sqlite3ColumnsFr
25380 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
25390 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61 62  e, pEList, &pTab
253a0 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
253b0 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 4d  Col);.    if( bM
253c0 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
253d0 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e 73       if( pSel->s
253e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
253f0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
25400 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
25410 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75  = "multiple recu
25420 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 73  rsive references
25430 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c  : %s";.      }el
25440 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65  se{.        pCte
25450 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 72 65 63  ->zCteErr = "rec
25460 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
25470 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20   in a subquery: 
25480 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  %s";.      }.   
25490 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
254a0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
254b0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  el);.    }.    p
254c0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 30  Cte->zCteErr = 0
254d0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
254e0 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
254f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
25500 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
25510 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
25520 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
25530 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
25540 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
25550 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68  econd argument h
25560 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64  as an associated
25570 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65   WITH .** clause
25580 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68  , pop it from th
25590 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61  e stack stored a
255a0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61  s part of the Pa
255b0 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  rse object..**.*
255c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
255d0 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78  is used as the x
255e0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28  SelectCallback2(
255f0 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a  ) callback by.**
25600 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
25610 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b  pand() when walk
25620 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65  ing a SELECT tre
25630 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62  e to resolve tab
25640 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20  le.** names and 
25650 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
25660 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a  e elements. .*/.
25670 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
25680 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72  ctPopWith(Walker
25690 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
256a0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
256b0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
256c0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20  ->pParse;.  if( 
256d0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 26 26  pParse->pWith &&
256e0 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b   p->pPrior==0 ){
256f0 0a 20 20 20 20 57 69 74 68 20 2a 70 57 69 74 68  .    With *pWith
25700 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74   = findRightmost
25710 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  (p)->pWith;.    
25720 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
25730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
25740 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69  arse->pWith==pWi
25750 74 68 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72  th );.      pPar
25760 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
25770 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d  h->pOuter;.    }
25780 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
25790 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
257a0 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
257b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
257c0 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
257d0 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
257e0 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
257f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
25800 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
25810 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
25820 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
25830 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
25840 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
25850 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
25860 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
25870 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
25880 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25890 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
258a0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
258b0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
258c0 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
258d0 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
258e0 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
258f0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
25900 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
25910 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
25920 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
25930 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
25940 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
25950 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
25960 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
25970 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
25980 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
25990 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
259a0 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
259b0 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
259c0 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
259d0 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
259e0 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
259f0 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
25a00 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
25a10 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
25a20 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
25a30 65 20 70 65 72 73 69 73 74 65 6e 74 20 72 65 70  e persistent rep
25a40 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
25a50 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
25a60 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
25a70 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
25a80 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
25a90 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74  to accommodate t
25aa0 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
25ab0 72 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e  rd.**         on
25ac0 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f   joins and the O
25ad0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
25ae0 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a  se of joins..**.
25af0 2a 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20  **    (4)  Scan 
25b00 74 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  the list of colu
25b10 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
25b20 74 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c  t set (pEList) l
25b30 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  ooking.**       
25b40 20 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20    for instances 
25b50 6f 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61  of the "*" opera
25b60 74 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45  tor or the TABLE
25b70 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20  .* operator..** 
25b80 20 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64          If found
25b90 2c 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a  , expand each "*
25ba0 22 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  " to be every co
25bb0 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61  lumn in every ta
25bc0 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61  ble.**         a
25bd0 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65  nd TABLE.* to be
25be0 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e   every column in
25bf0 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74   TABLE..**.*/.st
25c00 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45  atic int selectE
25c10 78 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a  xpander(Walker *
25c20 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
25c30 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
25c40 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
25c50 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c  pParse;.  int i,
25c60 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74   j, k;.  SrcList
25c70 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78   *pTabList;.  Ex
25c80 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
25c90 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
25ca0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20  _item *pFrom;.  
25cb0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
25cc0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
25cd0 20 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a   *pE, *pRight, *
25ce0 70 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c  pExpr;.  u16 sel
25cf0 46 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c  Flags = p->selFl
25d00 61 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c  ags;..  p->selFl
25d10 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64  ags |= SF_Expand
25d20 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ed;.  if( db->ma
25d30 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20  llocFailed  ){. 
25d40 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
25d50 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e  ort;.  }.  if( N
25d60 45 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29  EVER(p->pSrc==0)
25d70 20 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20   || (selFlags & 
25d80 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
25d90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
25da0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
25db0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
25dc0 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
25dd0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
25de0 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 73  ->pWith ){.    s
25df0 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
25e00 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c  Parse, p->pWith,
25e10 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d   0);.  }..  /* M
25e20 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20  ake sure cursor 
25e30 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65  numbers have bee
25e40 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c  n assigned to al
25e50 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a  l entries in.  *
25e60 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
25e70 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  e of the SELECT 
25e80 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
25e90 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
25ea0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
25eb0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b  arse, pTabList);
25ec0 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65  ..  /* Look up e
25ed0 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64  very table named
25ee0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
25ef0 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63  use of the selec
25f00 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  t.  If.  ** an e
25f10 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
25f20 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62   clause is a sub
25f30 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66  query instead of
25f40 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
25f50 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61  ,.  ** then crea
25f60 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74  te a transient t
25f70 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
25f80 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73  o describe the s
25f90 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  ubquery..  */.  
25fa0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
25fb0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
25fc0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
25fd0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
25fe0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
25ff0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
26000 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d  >fg.isRecursive=
26010 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61  =0 || pFrom->pTa
26020 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b!=0 );.    if( 
26030 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75  pFrom->fg.isRecu
26040 72 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65  rsive ) continue
26050 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
26060 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
26070 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26080 4d 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20  MIT_CTE.    if( 
26090 77 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b  withExpand(pWalk
260a0 65 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74  er, pFrom) ) ret
260b0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
260c0 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54     if( pFrom->pT
260d0 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e  ab ) {} else.#en
260e0 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f  dif.    if( pFro
260f0 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23  m->zName==0 ){.#
26100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26110 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
26120 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
26130 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
26140 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
26150 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
26160 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
26170 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73  LECT */.      as
26180 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b  sert( pSel!=0 );
26190 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
261a0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
261b0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
261c0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
261d0 6c 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65  lker, pSel) ) re
261e0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
261f0 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61        pFrom->pTa
26200 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
26210 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
26220 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
26230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
26240 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
26250 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70  C_Abort;.      p
26260 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31  Tab->nTabRef = 1
26270 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
26280 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
26290 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
262a0 5f 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29  _sq_%p", (void*)
262b0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
262c0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
262d0 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
262e0 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
262f0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
26300 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
26310 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74  se, pSel->pEList
26320 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54  ,&pTab->nCol,&pT
26330 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
26340 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
26350 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  1;.      pTab->n
26360 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
26370 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
26380 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
26390 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70 54  576) );.      pT
263a0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
263b0 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65  TF_Ephemeral;.#e
263c0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
263d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
263e0 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
263f0 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
26400 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
26410 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
26420 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
26430 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
26440 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
26450 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
26460 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
26470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
26480 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
26490 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
264a0 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  f( pTab->nTabRef
264b0 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  >=0xffff ){.    
264c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
264d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
264e0 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73   many references
264f0 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20   to \"%s\": max 
26500 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20  65535",.        
26510 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b     pTab->zName);
26520 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
26530 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
26540 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
26550 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
26560 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
26570 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  +;.      if( !Is
26580 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
26590 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
265a0 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  n(pParse, pFrom)
265b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
265c0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
265d0 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e      }.#if !defin
265e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
265f0 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
26600 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
26610 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
26620 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
26630 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70  pTab) || pTab->p
26640 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
26650 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20    i16 nCol;.    
26660 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
26670 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
26680 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
26690 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
266a0 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
266b0 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
266c0 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
266d0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
266e0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
266f0 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
26700 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
26710 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
26720 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53  etName(pFrom->pS
26730 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61  elect, pTab->zNa
26740 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  me);.        nCo
26750 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  l = pTab->nCol;.
26760 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43          pTab->nC
26770 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ol = -1;.       
26780 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
26790 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  ct(pWalker, pFro
267a0 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
267b0 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
267c0 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  = nCol;.      }.
267d0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
267e0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
267f0 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
26800 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
26810 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
26820 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
26830 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
26840 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
26850 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
26860 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
26870 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
26880 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
26890 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
268a0 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
268b0 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
268c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
268d0 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
268e0 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
268f0 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
26900 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
26910 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
26920 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
26930 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
26940 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
26950 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
26960 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
26970 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
26980 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
26990 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
269a0 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
269b0 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
269c0 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
269d0 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
269e0 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
269f0 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  h the TK_ASTERIS
26a00 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  K operator for e
26a10 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
26a20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
26a30 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20  umn.  ** list.  
26a40 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
26a50 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
26a60 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54  ocate the TK_AST
26a70 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65  ERISK.  ** expre
26a80 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
26a90 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  d each one to th
26aa0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
26ab0 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c  lumns in.  ** al
26ac0 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
26ad0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
26ae0 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
26af0 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
26b00 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
26b10 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
26b20 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
26b30 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
26b40 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
26b50 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70  k++){.    pE = p
26b60 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
26b70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
26b80 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29  p==TK_ASTERISK )
26b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
26ba0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
26bb0 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
26bc0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
26bd0 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
26be0 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21  T || (pE->pLeft!
26bf0 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  =0 && pE->pLeft-
26c00 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20  >op==TK_ID) );. 
26c10 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
26c20 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
26c30 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45  ght->op==TK_ASTE
26c40 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
26c50 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73 74  }.  if( k<pEList
26c60 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 2f  ->nExpr ){.    /
26c70 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20 67  *.    ** If we g
26c80 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e 73  et here it means
26c90 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
26ca0 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20  contains one or 
26cb0 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20  more "*".    ** 
26cc0 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 6e  operators that n
26cd0 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
26ce0 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ed.  Loop throug
26cf0 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
26d00 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  n.    ** in the 
26d10 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 65  result set and e
26d20 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62  xpand them one b
26d30 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  y one..    */.  
26d40 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
26d50 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69  t_item *a = pELi
26d60 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c  st->a;.    ExprL
26d70 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ist *pNew = 0;. 
26d80 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70     int flags = p
26d90 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
26da0 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61  ;.    int longNa
26db0 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20 53  mes = (flags & S
26dc0 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d  QLITE_FullColNam
26dd0 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  es)!=0.         
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
26df0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
26e00 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d  ShortColNames)==
26e10 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b  0;..    for(k=0;
26e20 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
26e30 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45  ; k++){.      pE
26e40 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20   = a[k].pExpr;. 
26e50 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
26e60 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
26e70 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
26e80 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
26e90 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
26ea0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45   pE->op!=TK_ASTE
26eb0 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28  RISK.       && (
26ec0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
26ed0 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
26ee0 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20  _ASTERISK).     
26ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
26f00 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
26f10 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
26f20 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
26f30 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
26f40 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
26f50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
26f60 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
26f70 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
26f80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
26f90 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
26fa0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
26fb0 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
26fc0 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
26fd0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
26fe0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
26ff0 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
27000 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
27010 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
27020 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
27030 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
27040 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
27050 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
27060 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
27070 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
27080 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
27090 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
270a0 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
270b0 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
270c0 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
270d0 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
270e0 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
270f0 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
27100 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
27110 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  TName = 0;      
27120 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
27130 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
27140 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
27150 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
27160 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
27170 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
27180 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
27190 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
271a0 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
271b0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
271c0 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
271d0 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
271e0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
271f0 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
27200 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
27210 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
27220 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
27230 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
27240 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
27250 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
27260 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
27270 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
27280 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
27290 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
272a0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
272b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
272c0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b  zSchemaName = 0;
272d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
272e0 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  Db;.          if
272f0 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
27300 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
27310 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
27320 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
27330 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
27340 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
27350 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
27360 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
27370 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  | (pSub->selFlag
27380 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
27390 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
273a0 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20       pSub = 0;. 
273b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
273c0 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
273d0 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
273e0 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
273f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
27400 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
27410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27420 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
27430 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
27440 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
27450 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63  .            zSc
27460 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d  hemaName = iDb>=
27470 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 ? db->aDb[iDb]
27480 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b  .zDbSName : "*";
27490 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
274a0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
274b0 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
274c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
274d0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
274e0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
274f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
27500 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
27510 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
27520 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
27530 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
27540 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
27550 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
27560 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
27570 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
27580 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
27590 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
275a0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
275b0 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
275c0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
275d0 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
275e0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
275f0 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
27600 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
27610 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
27620 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
27630 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
27640 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
27650 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27660 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27670 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
27680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
27690 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
276a0 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c  ked as 'hidden',
276b0 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68   omit it from th
276c0 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
276d0 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
276e0 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73  -set list unless
276f0 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
27700 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  the SF_IncludeHi
27710 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  dden.           
27720 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20   ** bit set..   
27730 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
27740 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e          if( (p->
27750 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e  selFlags & SF_In
27760 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a  cludeHidden)==0.
27770 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
27780 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
27790 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a  pTab->aCol[j]) .
277a0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
277b0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
277c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
277d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
277e0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
277f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27800 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
27810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27820 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66     if( (pFrom->f
27830 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
27840 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
27850 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
27860 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
27870 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
27880 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
27890 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
278a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
278b0 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
278c0 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
278d0 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
278e0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
278f0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
27900 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
27910 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
27920 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
27930 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
27940 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
27950 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
27960 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
27970 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
27980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27990 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
279a0 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
279b0 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
279c0 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
279d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
279e0 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
279f0 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
27a00 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
27a10 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
27a20 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
27a30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
27a40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
27a50 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
27a60 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
27a70 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
27a80 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
27a90 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
27aa0 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
27ab0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
27ac0 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
27ad0 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
27af0 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
27b00 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
27b10 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
27b20 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
27b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
27b40 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
27b50 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
27b60 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
27b70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
27b80 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
27b90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
27ba0 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
27bb0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
27bc0 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
27bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27be0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
27bf0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
27c00 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
27c10 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
27c20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27c30 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
27c40 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
27c50 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
27c60 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
27c70 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
27c80 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
27c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
27ca0 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
27cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27cc0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
27cd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27ce0 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
27cf0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
27d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
27d10 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
27d20 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
27d30 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
27d40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27d50 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43  te3TokenInit(&sC
27d60 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  olname, zColname
27d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
27d80 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
27d90 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
27da0 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
27db0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27dc0 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73  f( pNew && (p->s
27dd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
27de0 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20  tedFrom)!=0 ){. 
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
27e00 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
27e10 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61  m *pX = &pNew->a
27e20 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b  [pNew->nExpr-1];
27e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
27e40 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20  f( pSub ){.     
27e50 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
27e60 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
27e70 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  StrDup(db, pSub-
27e80 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
27e90 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
27ea0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27eb0 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
27ed0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27ee0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
27ef0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
27f00 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a  db, "%s.%s.%s",.
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
27f40 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  maName, zTabName
27f50 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
27f70 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
27f80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
27f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27fa0 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73       pX->bSpanIs
27fb0 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Tab = 1;.       
27fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27fd0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
27fe0 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
27ff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
28010 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
28020 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
28030 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
28040 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
28050 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
28060 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
28070 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
28080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28090 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
280a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
280b0 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
280c0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
280d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
280e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
280f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
28100 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
28110 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
28120 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20 53   pNew;.  }.#if S
28130 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
28140 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74  .  if( p->pEList
28150 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
28160 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
28170 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
28180 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
28190 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
281a0 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
281b0 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
281c0 73 65 74 22 29 3b 0a 20 20 20 20 72 65 74 75 72  set");.    retur
281d0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
281e0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
281f0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
28200 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
28210 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
28220 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
28230 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
28240 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
28250 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
28260 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
28270 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
28280 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
28290 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
282a0 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
282b0 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
282c0 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
282d0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
282e0 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
282f0 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
28300 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
28310 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
28320 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
28330 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
28340 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
28350 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
28360 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
28370 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61  3ExprWalkNoop(Wa
28380 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
28390 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
283a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
283b0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
283c0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
283d0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
283e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
283f0 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61  tine "expands" a
28400 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
28410 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  t and all of its
28420 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
28430 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  For additional i
28440 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68  nformation on wh
28450 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22  at it means to "
28460 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54  expand" a SELECT
28470 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73  .** statement, s
28480 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ee the comment o
28490 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61  n the selectExpa
284a0 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61  nd worker callba
284b0 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ck above..**.** 
284c0 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45  Expanding a SELE
284d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
284e0 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69  the first step i
284f0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a  n processing a.*
28500 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
28510 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  nt.  The SELECT 
28520 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62  statement must b
28530 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
28540 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75  e.** name resolu
28550 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65  tion is performe
28560 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74  d..**.** If anyt
28570 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
28580 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
28590 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
285a0 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65  o pParse..** The
285b0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
285c0 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65  n can detect the
285d0 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b   problem by look
285e0 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e  ing at pParse->n
285f0 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50  Err.** and/or pP
28600 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
28610 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  Failed..*/.stati
28620 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
28630 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65  lectExpand(Parse
28640 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
28650 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61   *pSelect){.  Wa
28660 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
28670 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
28680 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
28690 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
286a0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
286b0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
286c0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
286d0 68 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20  hasCompound ){. 
286e0 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c     w.xSelectCall
286f0 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f  back = convertCo
28700 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75  mpoundSelectToSu
28710 62 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69  bquery;.    sqli
28720 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
28730 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  , pSelect);.  }.
28740 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
28750 61 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61  ack = selectExpa
28760 6e 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63  nder;.  w.xSelec
28770 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c  tCallback2 = sel
28780 65 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71  ectPopWith;.  sq
28790 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
287a0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a  &w, pSelect);.}.
287b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
287c0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f  _OMIT_SUBQUERY./
287d0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57  *.** This is a W
287e0 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
287f0 6c 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66  lback callback f
28800 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65  or the sqlite3Se
28810 6c 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a  lectTypeInfo().*
28820 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a  * interface..**.
28830 2a 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d  ** For each FROM
28840 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
28850 2c 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79  , add Column.zTy
28860 70 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43  pe and Column.zC
28870 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  oll.** informati
28880 6f 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  on to the Table 
28890 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
288a0 65 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65  epresents the re
288b0 73 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74  sult set.** of t
288c0 68 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a  hat subquery..**
288d0 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
288e0 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
288f0 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
28900 6c 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74  lt set was const
28910 72 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c  ructed.** by sel
28920 65 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75  ectExpander() bu
28930 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63  t the type and c
28940 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  ollation informa
28950 74 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64  tion was omitted
28960 0a 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e  .** at that poin
28970 74 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69  t because identi
28980 66 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65  fiers had not ye
28990 74 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  t been resolved.
289a0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
289b0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
289c0 72 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73  r identifier res
289d0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
289e0 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64  ic void selectAd
289f0 64 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66  dSubqueryTypeInf
28a00 6f 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  o(Walker *pWalke
28a10 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
28a20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
28a30 20 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69    int i;.  SrcLi
28a40 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20  st *pTabList;.  
28a50 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
28a60 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61  tem *pFrom;..  a
28a70 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
28a80 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
28a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
28aa0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28ab0 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20  HasTypeInfo)==0 
28ac0 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  );.  p->selFlags
28ad0 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e   |= SF_HasTypeIn
28ae0 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
28af0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
28b00 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
28b10 70 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  pSrc;.  for(i=0,
28b20 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d   pFrom=pTabList-
28b30 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  >a; i<pTabList->
28b40 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d  nSrc; i++, pFrom
28b50 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ++){.    Table *
28b60 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
28b70 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ab;.    assert( 
28b80 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69  pTab!=0 );.    i
28b90 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61  f( (pTab->tabFla
28ba0 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
28bb0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  l)!=0 ){.      /
28bc0 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
28bd0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
28be0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
28bf0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
28c00 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
28c10 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ect;.      if( p
28c20 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77  Sel ){.        w
28c30 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
28c40 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
28c50 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
28c60 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
28c70 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
28c80 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
28c90 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20   pTab, pSel);.  
28ca0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
28cb0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
28cc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
28cd0 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20  ds datatype and 
28ce0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
28cf0 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ce information t
28d00 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73  o.** the Table s
28d10 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c  tructures of all
28d20 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
28d30 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20  queries in a.** 
28d40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28d50 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73  ..**.** Use this
28d60 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e   routine after n
28d70 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ame resolution..
28d80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
28d90 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
28da0 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ypeInfo(Parse *p
28db0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
28dc0 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66  Select){.#ifndef
28dd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
28de0 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77  QUERY.  Walker w
28df0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
28e00 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
28e10 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
28e20 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
28e30 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
28e40 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
28e50 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
28e60 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
28e70 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
28e80 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
28e90 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
28ea0 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
28eb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
28ec0 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
28ed0 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
28ee0 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
28ef0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
28f00 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
28f10 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
28f20 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
28f30 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
28f40 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
28f50 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
28f60 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
28f70 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
28f80 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
28f90 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
28fa0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
28fb0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
28fc0 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
28fd0 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
28fe0 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
28ff0 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
29000 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
29010 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
29020 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
29030 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
29040 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
29050 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
29060 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29070 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
29080 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
29090 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
290a0 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
290b0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
290c0 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
290d0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
290e0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
290f0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
29100 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
29110 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
29120 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
29130 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
29140 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
29150 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
29160 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
29170 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
29180 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  db;.  if( NEVER(
29190 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
291a0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
291b0 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
291c0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
291d0 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  rn;.  if( p->sel
291e0 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
291f0 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b  peInfo ) return;
29200 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
29210 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70  Expand(pParse, p
29220 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
29230 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
29240 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
29250 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
29260 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
29270 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
29280 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
29290 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
292a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
292b0 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
292c0 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
292d0 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a  o(pParse, p);.}.
292e0 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
292f0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
29300 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ulator..**.** Th
29310 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
29320 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74  mulator is a set
29330 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
29340 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e   that hold.** in
29350 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c  termediate resul
29360 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61  ts while calcula
29370 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ting an aggregat
29380 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  e.  This.** rout
29390 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
293a0 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e  de that stores N
293b0 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74  ULLs in all of t
293c0 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63  hose memory.** c
293d0 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
293e0 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75  void resetAccumu
293f0 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
29400 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
29410 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
29420 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
29430 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  be;.  int i;.  s
29440 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
29450 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74  nc *pFunc;.  int
29460 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f   nReg = pAggInfo
29470 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e  ->nFunc + pAggIn
29480 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  fo->nColumn;.  i
29490 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74  f( nReg==0 ) ret
294a0 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  urn;.#ifdef SQLI
294b0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  TE_DEBUG.  /* Ve
294c0 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67  rify that all Ag
294d0 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20  gInfo registers 
294e0 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72  are within the r
294f0 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62  ange specified b
29500 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d  y.  ** AggInfo.m
29510 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78  nReg..AggInfo.mx
29520 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  Reg */.  assert(
29530 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d   nReg==pAggInfo-
29540 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d  >mxReg-pAggInfo-
29550 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f  >mnReg+1 );.  fo
29560 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
29570 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
29580 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41  {.    assert( pA
29590 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
295a0 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
295b0 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
295c0 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  & pAggInfo->aCol
295d0 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e  [i].iMem<=pAggIn
295e0 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d  fo->mxReg );.  }
295f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41  .  for(i=0; i<pA
29600 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29610 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
29620 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
29630 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
29640 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
29650 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
29660 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70  aFunc[i].iMem<=p
29670 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29  AggInfo->mxReg )
29680 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
29690 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
296a0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
296b0 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c  pAggInfo->mnReg,
296c0 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67   pAggInfo->mxReg
296d0 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70  );.  for(pFunc=p
296e0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20  AggInfo->aFunc, 
296f0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
29700 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75  >nFunc; i++, pFu
29710 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  nc++){.    if( p
29720 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
29730 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
29740 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
29750 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72  xpr;.      asser
29760 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
29770 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65  rty(pE, EP_xIsSe
29780 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69  lect) );.      i
29790 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d  f( pE->x.pList==
297a0 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  0 || pE->x.pList
297b0 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20  ->nExpr!=1 ){.  
297c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
297d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44  orMsg(pParse, "D
297e0 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74  ISTINCT aggregat
297f0 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61  es must have exa
29800 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20  ctly one ".     
29810 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22        "argument"
29820 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63  );.        pFunc
29830 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31  ->iDistinct = -1
29840 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29850 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a         KeyInfo *
29860 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
29870 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
29880 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69  Parse, pE->x.pLi
29890 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  st, 0, 0);.     
298a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
298b0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
298c0 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
298d0 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
298e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
298f0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
29900 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
29910 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
29920 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
29930 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
29940 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
29950 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
29960 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
29970 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
29980 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
29990 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
299a0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
299b0 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
299c0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
299d0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
299e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
299f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
29a00 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
29a10 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
29a20 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
29a30 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
29a40 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
29a50 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
29a60 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
29a70 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
29a80 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
29a90 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
29aa0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
29ab0 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
29ac0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29ad0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
29ae0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
29af0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29  List->nExpr : 0)
29b00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29b10 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d  eAppendP4(v, pF-
29b20 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
29b30 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EF);.  }.}../*.*
29b40 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63  * Update the acc
29b50 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20  umulator memory 
29b60 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67  cells for an agg
29b70 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a  regate based on.
29b80 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ** the current c
29b90 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a  ursor position..
29ba0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
29bb0 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
29bc0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
29bd0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
29be0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
29bf0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
29c00 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65   int i;.  int re
29c10 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  gHit = 0;.  int 
29c20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b  addrHitTest = 0;
29c30 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
29c40 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74  o_func *pF;.  st
29c50 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
29c60 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66   *pC;..  pAggInf
29c70 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
29c80 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  1;.  for(i=0, pF
29c90 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
29ca0 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
29cb0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
29cc0 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20  .    int nArg;. 
29cd0 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20     int addrNext 
29ce0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  = 0;.    int reg
29cf0 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Agg;.    ExprLis
29d00 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
29d10 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
29d20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
29d30 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
29d40 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
29d50 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ect) );.    if( 
29d60 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e  pList ){.      n
29d70 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  Arg = pList->nEx
29d80 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67  pr;.      regAgg
29d90 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
29da0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
29db0 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Arg);.      sqli
29dc0 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
29dd0 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
29de0 74 2c 20 72 65 67 41 67 67 2c 20 30 2c 20 53 51  t, regAgg, 0, SQ
29df0 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a  LITE_ECEL_DUP);.
29e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29e10 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20   nArg = 0;.     
29e20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20   regAgg = 0;.   
29e30 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69   }.    if( pF->i
29e40 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
29e50 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20       addrNext = 
29e60 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
29e70 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 74  abel(v);.      t
29e80 65 73 74 63 61 73 65 28 20 6e 41 72 67 3d 3d 30  estcase( nArg==0
29e90 20 29 3b 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f   );  /* Error co
29ea0 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ndition */.     
29eb0 20 74 65 73 74 63 61 73 65 28 20 6e 41 72 67 3e   testcase( nArg>
29ec0 31 20 29 3b 20 20 20 2f 2a 20 41 6c 73 6f 20 61  1 );   /* Also a
29ed0 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  n error */.     
29ee0 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50   codeDistinct(pP
29ef0 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69  arse, pF->iDisti
29f00 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31  nct, addrNext, 1
29f10 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d  , regAgg);.    }
29f20 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75  .    if( pF->pFu
29f30 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  nc->funcFlags & 
29f40 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
29f50 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f  COLL ){.      Co
29f60 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30  llSeq *pColl = 0
29f70 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
29f80 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
29f90 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  tem;.      int j
29fa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29fb0 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  pList!=0 );  /* 
29fc0 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e  pList!=0 if pF->
29fd0 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f  pFunc has NEEDCO
29fe0 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  LL */.      for(
29ff0 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  j=0, pItem=pList
2a000 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a  ->a; !pColl && j
2a010 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65  <nArg; j++, pIte
2a020 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43  m++){.        pC
2a030 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2a040 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
2a050 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
2a060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a070 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
2a080 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72      pColl = pPar
2a090 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  se->db->pDfltCol
2a0a0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
2a0b0 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26   if( regHit==0 &
2a0c0 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  & pAggInfo->nAcc
2a0d0 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69  umulator ) regHi
2a0e0 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
2a0f0 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
2a100 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2a110 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69  P_CollSeq, regHi
2a120 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  t, 0, 0, (char *
2a130 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53  )pColl, P4_COLLS
2a140 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  EQ);.    }.    s
2a150 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2a160 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c  (v, OP_AggStep0,
2a170 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
2a180 69 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  iMem);.    sqlit
2a190 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
2a1a0 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  , pF->pFunc, P4_
2a1b0 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71  FUNCDEF);.    sq
2a1c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2a1d0 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a  5(v, (u8)nArg);.
2a1e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2a1f0 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
2a200 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67  ge(pParse, regAg
2a210 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  g, nArg);.    sq
2a220 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2a230 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
2a240 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
2a250 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b   if( addrNext ){
2a260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a270 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2a280 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20  , addrNext);.   
2a290 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2a2a0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2a2b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2a2c0 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74  * Before populat
2a2d0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
2a2e0 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 63  tor registers, c
2a2f0 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
2a300 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65  cache..  ** Othe
2a310 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66  rwise, if any of
2a320 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63 6f   the required co
2a330 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20  lumn values are 
2a340 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 20  already present 
2a350 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65  .  ** in registe
2a360 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43  rs, sqlite3ExprC
2a370 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50  ode() may use OP
2a380 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74  _SCopy to copy t
2a390 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f  he value.  ** to
2a3a0 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62   pC->iMem. But b
2a3b0 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 76  y the time the v
2a3c0 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74 68  alue is used, th
2a3d0 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73  e original regis
2a3e0 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76  ter.  ** may hav
2a3f0 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76  e been used, inv
2a400 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e  alidating the un
2a410 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20  derlying buffer 
2a420 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a  holding the.  **
2a430 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61   text or blob va
2a440 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20  lue. See ticket 
2a450 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20  [883034dcb5]..  
2a460 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20  **.  ** Another 
2a470 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62  solution would b
2a480 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  e to change the 
2a490 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f  OP_SCopy used to
2a4a0 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a   copy cached.  *
2a4b0 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f  * values to an O
2a4c0 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69  P_Copy..  */.  i
2a4d0 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20  f( regHit ){.   
2a4e0 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 73   addrHitTest = s
2a4f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2a500 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69  (v, OP_If, regHi
2a510 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
2a520 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
2a530 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2a540 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
2a550 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
2a560 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
2a570 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2a580 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
2a590 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2a5a0 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
2a5b0 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
2a5c0 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
2a5d0 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
2a5e0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2a5f0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2a600 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65  .  if( addrHitTe
2a610 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
2a620 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2a630 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20   addrHitTest);. 
2a640 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
2a650 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
2a660 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
2a670 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
2a680 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
2a690 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
2a6a0 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
2a6b0 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
2a6c0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2a6d0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
2a6e0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
2a6f0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
2a700 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
2a730 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
2a740 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
2a750 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
2a760 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
2a770 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
2a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a790 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
2a7a0 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
2a7b0 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
2a7c0 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
2a7d0 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
2a7e0 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d 20 28    int bCover = (
2a7f0 70 49 64 78 21 3d 30 20 26 26 20 28 48 61 73 52  pIdx!=0 && (HasR
2a800 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 21 49  owid(pTab) || !I
2a810 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
2a820 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20 63 68  (pIdx)));.    ch
2a830 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74  ar *zEqp = sqlit
2a840 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
2a850 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c  ->db, "SCAN TABL
2a860 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20  E %s%s%s",.     
2a870 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a     pTab->zName,.
2a880 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2a890 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
2a8a0 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
2a8b0 20 20 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f          bCover ?
2a8c0 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22   pIdx->zName : "
2a8d0 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  ".    );.    sql
2a8e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
2a8f0 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2a900 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69  pVdbe, OP_Explai
2a910 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
2a920 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70  ctId, 0, 0, zEqp
2a930 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20  , P4_DYNAMIC.   
2a940 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
2a950 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
2a960 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c  SimpleCount(a,b,
2a970 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c).#endif../*.**
2a980 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
2a990 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
2a9a0 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e  atement given in
2a9b0 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e   the p argument.
2a9c0 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73    .**.** The res
2a9d0 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65  ults are returne
2a9e0 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  d according to t
2a9f0 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
2aa00 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20  ructure..** See 
2aa10 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69  comments in sqli
2aa20 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74  teInt.h for furt
2aa30 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  her information.
2aa40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2aa50 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
2aa60 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
2aa70 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
2aa80 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
2aa90 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
2aaa0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
2aab0 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
2aac0 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
2aad0 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
2aae0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
2aaf0 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
2ab00 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
2ab10 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
2ab20 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2ab30 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
2ab40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2ab50 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
2ab60 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2ab70 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2ab80 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2ab90 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2aba0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
2abb0 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
2abc0 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
2abd0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
2abe0 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
2abf0 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
2ac00 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
2ac10 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
2ac20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ac30 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
2ac40 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
2ac50 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
2ac60 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
2ac70 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
2ac80 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
2ac90 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2aca0 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
2acb0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
2acc0 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
2acd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ace0 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
2acf0 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
2ad00 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
2ad10 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f   *pEList = 0;  /
2ad20 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
2ad30 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
2ad40 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2ad50 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
2ad60 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
2ad70 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
2ad80 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
2ad90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
2ada0 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
2adb0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
2adc0 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
2add0 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
2ade0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
2adf0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
2ae00 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
2ae10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
2ae20 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
2ae30 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
2ae40 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
2ae50 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
2ae60 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
2ae70 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
2ae80 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73  DistinctCtx sDis
2ae90 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f  tinct; /* Info o
2aea0 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
2aeb0 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
2aec0 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  rd */.  SortCtx 
2aed0 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f  sSort;         /
2aee0 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
2aef0 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20   code the ORDER 
2af00 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41  BY clause */.  A
2af10 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
2af20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
2af30 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
2af40 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
2af50 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
2af60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2af70 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
2af80 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
2af90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
2afa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2afb0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2afc0 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  tion */..#ifndef
2afd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2afe0 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73 74  LAIN.  int iRest
2aff0 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70 50  oreSelectId = pP
2b000 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b  arse->iSelectId;
2b010 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  .  pParse->iSele
2b020 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69  ctId = pParse->i
2b030 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a  NextSelectId++;.
2b040 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20 70  #endif..  db = p
2b050 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
2b060 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c   p==0 || db->mal
2b070 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
2b080 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
2b090 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
2b0a0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
2b0b0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
2b0c0 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20  LITE_SELECT, 0, 
2b0d0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31  0, 0) ) return 1
2b0e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67  ;.  memset(&sAgg
2b0f0 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
2b100 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20  sAggInfo));.#if 
2b110 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
2b120 4c 45 44 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53  LED.  pParse->nS
2b130 65 6c 65 63 74 49 6e 64 65 6e 74 2b 2b 3b 0a 20  electIndent++;. 
2b140 20 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70   SELECTTRACE(1,p
2b150 50 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e  Parse,p, ("begin
2b160 20 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 29   processing:\n")
2b170 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2b180 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2b190 31 30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  100 ){.    sqlit
2b1a0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
2b1b0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
2b1c0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
2b1d0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2b1e0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2b1f0 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 29 3b  =SRT_DistFifo );
2b200 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2b210 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2b220 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 46  st->eDest!=SRT_F
2b230 69 66 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ifo );.  assert(
2b240 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
2b250 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  || pDest->eDest!
2b260 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
2b270 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2b280 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
2b290 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
2b2a0 51 75 65 75 65 20 29 3b 0a 20 20 69 66 28 20 49  Queue );.  if( I
2b2b0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
2b2c0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73  pDest) ){.    as
2b2d0 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
2b2e0 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
2b2f0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2b300 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
2b310 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
2b320 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
2b330 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
2b340 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 7c 7c  ==SRT_Discard ||
2b350 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
2b360 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 51 75  t->eDest==SRT_Qu
2b370 65 75 65 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65  eue  || pDest->e
2b380 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
2b390 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  fo ||.          
2b3a0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2b3b0 52 54 5f 44 69 73 74 51 75 65 75 65 20 7c 7c 20  RT_DistQueue || 
2b3c0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
2b3d0 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20  T_Fifo);.    /* 
2b3e0 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65  If ORDER BY make
2b3f0 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
2b400 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68  in the output th
2b410 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a  en neither does.
2b420 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20      ** DISTINCT 
2b430 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d  so it can be rem
2b440 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  oved too. */.   
2b450 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2b460 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
2b470 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
2b480 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
2b490 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2b4a0 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
2b4b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
2b4c0 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
2b4d0 2c 20 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  , 0);.  memset(&
2b4e0 73 53 6f 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  sSort, 0, sizeof
2b4f0 28 73 53 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72  (sSort));.  sSor
2b500 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
2b510 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62  pOrderBy;.  pTab
2b520 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
2b530 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2b540 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
2b550 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
2b560 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2b570 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
2b580 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69  pEList!=0 );.  i
2b590 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  sAgg = (p->selFl
2b5a0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
2b5b0 74 65 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45  te)!=0;.#if SELE
2b5c0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
2b5d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
2b5e0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
2b5f0 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52   ){.    SELECTTR
2b600 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
2b610 2c 70 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65  ,p, ("after name
2b620 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29   resolution:\n")
2b630 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
2b640 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
2b650 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
2b660 66 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  f..  /* Try to f
2b670 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69 65  latten subquerie
2b680 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2b690 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65  ause up into the
2b6a0 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f   main query.  */
2b6b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2b6c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
2b6d0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
2b6e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
2b6f0 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
2b700 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
2b710 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
2b720 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
2b730 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2b740 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2b750 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  [i];.    Select 
2b760 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
2b770 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20  Select;.    int 
2b780 69 73 41 67 67 53 75 62 3b 0a 20 20 20 20 54 61  isAggSub;.    Ta
2b790 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
2b7a0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
2b7b0 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
2b7c0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74  nue;..    /* Cat
2b7d0 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 74  ch mismatch in t
2b7e0 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75  he declared colu
2b7f0 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61 6e  mns of a view an
2b800 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  d the number of.
2b810 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69      ** columns i
2b820 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e 20  n the SELECT on 
2b830 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20 69  the RHS */.    i
2b840 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70  f( pTab->nCol!=p
2b850 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
2b860 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  pr ){.      sqli
2b870 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2b880 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25 64  se, "expected %d
2b890 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73   columns for '%s
2b8a0 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a 20  ' but got %d",. 
2b8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8c0 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c       pTab->nCol,
2b8d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53   pTab->zName, pS
2b8e0 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ub->pEList->nExp
2b8f0 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  r);.      goto s
2b900 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
2b910 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  ..    isAggSub =
2b920 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
2b930 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
2b940 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
2b950 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
2b960 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
2b970 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
2b980 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
2b990 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
2b9a0 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
2b9b0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
2b9c0 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
2b9d0 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
2b9e0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
2b9f0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
2ba00 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
2ba10 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
2ba20 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
2ba30 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
2ba40 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2ba50 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2ba60 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2ba70 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
2ba80 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
2ba90 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
2baa0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
2bab0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2bac0 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69  ..  /* Get a poi
2bad0 6e 74 65 72 20 74 68 65 20 56 44 42 45 20 75 6e  nter the VDBE un
2bae0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
2baf0 2c 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  , allocating a n
2bb00 65 77 20 56 44 42 45 20 69 66 20 6f 6e 65 0a 20  ew VDBE if one. 
2bb10 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   ** does not alr
2bb20 65 61 64 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  eady exist */.  
2bb30 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
2bb40 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
2bb50 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ( v==0 ) goto se
2bb60 6c 65 63 74 5f 65 6e 64 3b 0a 0a 23 69 66 6e 64  lect_end;..#ifnd
2bb70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
2bb80 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
2bb90 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f   /* Handle compo
2bba0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
2bbb0 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20  ments using the 
2bbc0 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65  separate multiSe
2bbd0 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63  lect().  ** proc
2bbe0 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  edure..  */.  if
2bbf0 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
2bc00 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
2bc10 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
2bc20 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61  Dest);.    expla
2bc30 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61  inSetInteger(pPa
2bc40 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2bc50 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
2bc60 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  );.#if SELECTTRA
2bc70 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53  CE_ENABLED.    S
2bc80 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
2bc90 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70  rse,p,("end comp
2bca0 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f 63  ound-select proc
2bcb0 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20  essing\n"));.   
2bcc0 20 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74   pParse->nSelect
2bcd0 49 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66  Indent--;.#endif
2bce0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2bcf0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2bd00 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
2bd10 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
2bd20 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
2bd30 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
2bd40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2bd50 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2bd60 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2bd70 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
2bd80 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
2bd90 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
2bda0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2bdb0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2bdc0 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b  &pTabList->a[i];
2bdd0 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20  .    SelectDest 
2bde0 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  dest;.    Select
2bdf0 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e   *pSub = pItem->
2be00 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
2be10 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
2be20 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
2be30 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
2be40 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
2be50 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
2be60 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
2be70 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
2be80 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
2be90 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
2bea0 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
2beb0 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
2bec0 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
2bed0 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
2bee0 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
2bef0 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
2bf00 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
2bf10 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
2bf20 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
2bf30 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
2bf40 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
2bf50 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
2bf60 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
2bf70 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
2bf80 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
2bf90 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
2bfa0 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
2bfb0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2bfc0 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
2bfd0 20 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 3d  fg.viaCoroutine=
2bff0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2c000 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c010 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74  v, OP_Gosub, pIt
2c020 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70  em->regReturn, p
2c030 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
2c040 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
2c050 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2c060 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
2c070 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68  ent Parse.nHeigh
2c080 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20  t by the height 
2c090 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  of the largest e
2c0a0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
2c0b0 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74   tree referred t
2c0c0 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70  o by this, the p
2c0d0 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68  arent select. Th
2c0e0 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20  e child select. 
2c0f0 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69     ** may contai
2c100 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2c110 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20  es of at most.  
2c120 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58    ** (SQLITE_MAX
2c130 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73  _EXPR_DEPTH-Pars
2c140 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68  e.nHeight) heigh
2c150 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74  t. This is a bit
2c160 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e  .    ** more con
2c170 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e  servative than n
2c180 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75  ecessary, but mu
2c190 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65  ch easier than e
2c1a0 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20  nforcing.    ** 
2c1b0 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a  an exact limit..
2c1c0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73      */.    pPars
2c1d0 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71  e->nHeight += sq
2c1e0 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
2c1f0 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f  eight(p);..    /
2c200 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
2c210 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d   constant WHERE-
2c220 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20  clause terms in 
2c230 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
2c240 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69  down.    ** insi
2c250 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  de the subquery.
2c260 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20    This can help 
2c270 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20  the subquery to 
2c280 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65  run more efficie
2c290 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ntly..    */.   
2c2a0 20 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e   if( (pItem->fg.
2c2b0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
2c2c0 54 45 52 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  TER)==0.     && 
2c2d0 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
2c2e0 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ms(pParse, pSub,
2c2f0 20 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65   p->pWhere, pIte
2c300 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20  m->iCursor).    
2c310 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ){.#if SELECTTRA
2c320 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
2c330 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
2c340 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20  ctTrace & 0x100 
2c350 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  ){.        SELEC
2c360 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2c370 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 57 48  rse,p,("After WH
2c380 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73 68 2d  ERE-clause push-
2c390 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  down:\n"));.    
2c3a0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2c3b0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2c3c0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
2c3d0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
2c3e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
2c3f0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
2c400 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a  subquery.    **.
2c410 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75      ** The subqu
2c420 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ery is implement
2c430 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
2c440 6e 65 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ne if all of the
2c450 73 65 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  se are true:.   
2c460 20 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73   **   (1)  The s
2c470 75 62 71 75 65 72 79 20 69 73 20 67 75 61 72 61  ubquery is guara
2c480 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68 65 20  nteed to be the 
2c490 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74  outer loop (so t
2c4a0 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 20 20  hat it.    **   
2c4b0 20 20 20 20 20 64 6f 65 73 20 6e 6f 74 20 6e 65       does not ne
2c4c0 65 64 20 74 6f 20 62 65 20 63 6f 6d 70 75 74 65  ed to be compute
2c4d0 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
2c4e0 29 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20  ).    **   (2)  
2c4f0 54 68 65 20 41 4c 4c 20 6b 65 79 77 6f 72 64 20  The ALL keyword 
2c500 61 66 74 65 72 20 53 45 4c 45 43 54 20 69 73 20  after SELECT is 
2c510 6f 6d 69 74 74 65 64 2e 20 20 28 41 70 70 6c 69  omitted.  (Appli
2c520 63 61 74 69 6f 6e 73 20 61 72 65 0a 20 20 20 20  cations are.    
2c530 2a 2a 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65  **        allowe
2c540 64 20 74 6f 20 73 61 79 20 22 53 45 4c 45 43 54  d to say "SELECT
2c550 20 41 4c 4c 22 20 69 6e 73 74 65 61 64 20 6f 66   ALL" instead of
2c560 20 6a 75 73 74 20 22 53 45 4c 45 43 54 22 20 74   just "SELECT" t
2c570 6f 20 64 69 73 61 62 6c 65 0a 20 20 20 20 2a 2a  o disable.    **
2c580 20 20 20 20 20 20 20 20 74 68 65 20 75 73 65 20          the use 
2c590 6f 66 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 29  of co-routines.)
2c5a0 0a 20 20 20 20 2a 2a 20 20 20 28 33 29 20 20 43  .    **   (3)  C
2c5b0 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 6e  o-routines are n
2c5c0 6f 74 20 64 69 73 61 62 6c 65 64 20 75 73 69 6e  ot disabled usin
2c5d0 67 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  g sqlite3_test_c
2c5e0 6f 6e 74 72 6f 6c 28 29 0a 20 20 20 20 2a 2a 20  ontrol().    ** 
2c5f0 20 20 20 20 20 20 20 77 69 74 68 20 53 51 4c 49         with SQLI
2c600 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2c610 4d 49 5a 41 54 49 4f 4e 53 2e 0a 20 20 20 20 2a  MIZATIONS..    *
2c620 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41  *.    ** TODO: A
2c630 72 65 20 74 68 65 72 65 20 6f 74 68 65 72 20 72  re there other r
2c640 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31  easons beside (1
2c650 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f  ) to use a co-ro
2c660 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70  utine.    ** imp
2c670 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20  lementation?.   
2c680 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30   */.    if( i==0
2c690 0a 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69  .     && (pTabLi
2c6a0 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
2c6b0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62          || (pTab
2c6c0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f  List->a[1].fg.jo
2c6d0 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c  intype&(JT_LEFT|
2c6e0 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20  JT_CROSS))!=0)  
2c6f0 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 26  /* (1) */.     &
2c700 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
2c710 20 53 46 5f 41 6c 6c 29 3d 3d 30 20 20 20 20 20   SF_All)==0     
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c740 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 26 26 20   (2) */.     && 
2c750 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2c760 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53  led(db, SQLITE_S
2c770 75 62 71 43 6f 72 6f 75 74 69 6e 65 29 20 20 20  ubqCoroutine)   
2c780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
2c790 33 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  3) */.    ){.   
2c7a0 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20     /* Implement 
2c7b0 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61  a co-routine tha
2c7c0 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  t will return a 
2c7d0 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
2c7e0 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
2c7f0 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e  * set on each in
2c800 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20  vocation..      
2c810 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
2c820 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  rTop = sqlite3Vd
2c830 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2c840 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  +1;.      pItem-
2c850 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
2c860 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2c870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c880 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43  dOp3(v, OP_InitC
2c890 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
2c8a0 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20 61  >regReturn, 0, a
2c8b0 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 56  ddrTop);.      V
2c8c0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2c8d0 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
2c8e0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
2c8f0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
2c900 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20  Sub = addrTop;. 
2c910 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
2c920 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
2c930 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
2c940 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
2c950 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  n);.      explai
2c960 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74 65  nSetInteger(pIte
2c970 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75  m->iSelectId, (u
2c980 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  8)pParse->iNextS
2c990 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
2c9a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
2c9b0 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
2c9c0 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
2c9d0 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
2c9e0 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63  t = pSub->nSelec
2c9f0 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65  tRow;.      pIte
2ca00 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2ca10 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  ne = 1;.      pI
2ca20 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d  tem->regResult =
2ca30 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20   dest.iSdst;.   
2ca40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
2ca50 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49  dCoroutine(v, pI
2ca60 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
2ca70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ca80 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
2ca90 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  drTop-1);.      
2caa0 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
2cab0 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
2cac0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2cad0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2cae0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2caf0 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70   will fill an ep
2cb00 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2cb10 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  th.      ** the 
2cb20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
2cb30 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d  subquery.  pItem
2cb40 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69  ->addrFillSub wi
2cb50 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a  ll point.      *
2cb60 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
2cb70 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
2cb80 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
2cb90 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
2cba0 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
2cbb0 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
2cbc0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62   to hold the sub
2cbd0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
2cbe0 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a  ddress.      */.
2cbf0 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64        int topAdd
2cc00 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  r;.      int onc
2cc10 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  eAddr = 0;.     
2cc20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20   int retAddr;.  
2cc30 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2cc40 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
2cc50 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
2cc60 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
2cc70 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2cc80 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
2cc90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2cca0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
2ccb0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
2ccc0 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
2ccd0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2cce0 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
2ccf0 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
2cd00 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
2cd10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
2cd20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
2cd30 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
2cd40 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
2cd50 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
2cd60 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
2cd70 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
2cd80 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
2cd90 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
2cda0 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
2cdb0 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
2cdc0 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
2cdd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
2cde0 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64  (v, OP_Once); Vd
2cdf0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2ce00 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2ce10 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
2ce20 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
2ce30 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2ce40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2ce50 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70          VdbeNoop
2ce60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74  Comment((v, "mat
2ce70 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22  erialize \"%s\""
2ce80 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
2ce90 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Name));.      }.
2cea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
2ceb0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
2cec0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
2ced0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
2cee0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
2cef0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
2cf00 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
2cf10 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
2cf20 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
2cf30 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
2cf40 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
2cf50 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
2cf60 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
2cf70 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
2cf80 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ow;.      if( on
2cf90 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  ceAddr ) sqlite3
2cfa0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2cfb0 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20  onceAddr);.     
2cfc0 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74   retAddr = sqlit
2cfd0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2cfe0 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  OP_Return, pItem
2cff0 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2d000 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2d010 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
2d020 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2d030 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2d040 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
2d050 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64   topAddr, retAdd
2d060 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
2d070 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2d080 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2d090 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
2d0a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
2d0b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2d0c0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
2d0d0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
2d0e0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
2d0f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2d100 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e  * Various elemen
2d110 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
2d120 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63   copied into loc
2d130 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72  al variables for
2d140 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63  .  ** convenienc
2d150 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
2d160 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68  p->pEList;.  pWh
2d170 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
2d180 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
2d190 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
2d1a0 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
2d1b0 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
2d1c0 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
2d1d0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2d1e0 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c  ct)!=0;..#if SEL
2d1f0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
2d200 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
2d210 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2d220 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
2d230 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
2d240 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20  e,p,("After all 
2d250 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c  FROM-clause anal
2d260 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ysis:\n"));.    
2d270 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2d280 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2d290 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2d2a0 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73   If the query is
2d2b0 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61   DISTINCT with a
2d2c0 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69  n ORDER BY but i
2d2d0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
2d2e0 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66  te, and .  ** if
2d2f0 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74   the select-list
2d300 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
2d310 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73  the ORDER BY lis
2d320 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65  t, then this que
2d330 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72  ry.  ** can be r
2d340 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52  ewritten as a GR
2d350 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72  OUP BY. In other
2d360 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20   words, this:.  
2d370 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
2d380 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20  CT DISTINCT xyz 
2d390 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42  FROM ... ORDER B
2d3a0 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Y xyz.  **.  ** 
2d3b0 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74  is transformed t
2d3c0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
2d3d0 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d   SELECT xyz FROM
2d3e0 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79   ... GROUP BY xy
2d3f0 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20  z ORDER BY xyz. 
2d400 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63   **.  ** The sec
2d410 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66  ond form is pref
2d420 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c  erred as a singl
2d430 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70  e index (or temp
2d440 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a  -table) may be .
2d450 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f    ** used for bo
2d460 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  th the ORDER BY 
2d470 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f  and DISTINCT pro
2d480 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67  cessing. As orig
2d490 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69  inally .  ** wri
2d4a0 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d  tten the query m
2d4b0 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74  ust use a temp-t
2d4c0 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73  able for at leas
2d4d0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44  t one of the ORD
2d4e0 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20  ER .  ** BY and 
2d4f0 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e  DISTINCT, and an
2d500 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61   index or separa
2d510 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f  te temp-table fo
2d520 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a  r the other..  *
2d530 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
2d540 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
2d550 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
2d560 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
2d570 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78  .   && sqlite3Ex
2d580 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73 53  prListCompare(sS
2d590 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70 45  ort.pOrderBy, pE
2d5a0 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29  List, -1)==0.  )
2d5b0 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  {.    p->selFlag
2d5c0 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
2d5d0 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  t;.    pGroupBy 
2d5e0 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  = p->pGroupBy = 
2d5f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2d600 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30  up(db, pEList, 0
2d610 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65  );.    /* Notice
2d620 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
2d630 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68  ht SF_Distinct h
2d640 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20  as been cleared 
2d650 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  from p->selFlags
2d660 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69  ,.    ** the sDi
2d670 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73  stinct.isTnct is
2d680 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e   still set.  Hen
2d690 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65  ce, isTnct repre
2d6a0 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a  sents the.    **
2d6b0 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e   original settin
2d6c0 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74  g of the SF_Dist
2d6d0 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74  inct flag, not t
2d6e0 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
2d6f0 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ng */.    assert
2d700 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
2d710 63 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43  ct );..#if SELEC
2d720 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2d730 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
2d740 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
2d750 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  0 ){.      SELEC
2d760 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61  TTRACE(0x400,pPa
2d770 72 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f 72  rse,p,("Transfor
2d780 6d 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f 20  m DISTINCT into 
2d790 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b 0a  GROUP BY:\n"));.
2d7a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
2d7b0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2d7c0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
2d7d0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  if.  }..  /* If 
2d7e0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
2d7f0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
2d800 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70 68 65  n create an ephe
2d810 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a 20  meral index to. 
2d820 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74 69   ** do the sorti
2d830 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20 73 6f  ng.  But this so
2d840 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c 20  rting ephemeral 
2d850 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
2d860 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75 6e  up.  ** being un
2d870 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
2d880 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74 65   can be extracte
2d890 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20  d in pre-sorted 
2d8a0 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74  order..  ** If t
2d8b0 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c  hat is the case,
2d8c0 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70 65   then the OP_Ope
2d8d0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
2d8e0 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20  uction will be. 
2d8f0 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20 61   ** changed to a
2d900 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77  n OP_Noop once w
2d910 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 61  e figure out tha
2d920 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  t the sorting in
2d930 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  dex is.  ** not 
2d940 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73 53 6f  needed.  The sSo
2d950 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2d960 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
2d970 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 0a  d to facilitate.
2d980 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67 65    ** that change
2d990 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f  ..  */.  if( sSo
2d9a0 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  rt.pOrderBy ){. 
2d9b0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2d9c0 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Info;.    pKeyIn
2d9d0 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
2d9e0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2d9f0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
2da00 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   0, pEList->nExp
2da10 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69 45  r);.    sSort.iE
2da20 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
2da30 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53 6f  >nTab++;.    sSo
2da40 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  rt.addrSortIndex
2da50 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
2da60 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2da70 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
2da80 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e            sSort.
2da90 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74 2e  iECursor, sSort.
2daa0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
2dab0 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  1+pEList->nExpr,
2dac0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28 63   0,.          (c
2dad0 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2dae0 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20 20  4_KEYINFO.      
2daf0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2db00 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
2db10 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
2db20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
2db30 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
2db40 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
2db50 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
2db60 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
2db70 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2db80 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
2db90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2dba0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
2dbb0 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
2dbc0 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74  >iSDParm, pEList
2dbd0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
2dbe0 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
2dbf0 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
2dc00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2dc10 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 66  keLabel(v);.  if
2dc20 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
2dc30 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29 3d   SF_FixedLimit)=
2dc40 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53 65  =0 ){.    p->nSe
2dc50 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
2dc60 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
2dc70 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70 75  s */.  }.  compu
2dc80 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
2dc90 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
2dca0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
2dcb0 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e 61  it==0 && sSort.a
2dcc0 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20  ddrSortIndex>=0 
2dcd0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
2dce0 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76  beChangeOpcode(v
2dcf0 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2dd00 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65 72  Index, OP_Sorter
2dd10 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72 74  Open);.    sSort
2dd20 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53 4f  .sortFlags |= SO
2dd30 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
2dd40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
2dd50 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
2dd60 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
2dd70 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
2dd80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
2dd90 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
2dda0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44 69  tinct ){.    sDi
2ddb0 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d  stinct.tabTnct =
2ddc0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2ddd0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 61  .    sDistinct.a
2dde0 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74 65  ddrTnct = sqlite
2ddf0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2de00 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2de10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
2de30 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
2de40 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de60 20 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e      (char*)keyIn
2de70 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
2de80 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74  Parse, p->pEList
2de90 2c 30 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20  ,0,0),.         
2dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2deb0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
2dec0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2ded0 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
2dee0 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
2def0 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
2df00 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
2df10 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
2df20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2df30 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2df40 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
2df50 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
2df60 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
2df70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
2df80 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
2df90 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
2dfa0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
2dfb0 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
2dfc0 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
2dfd0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
2dfe0 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
2dff0 43 54 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  CT : 0);.    ass
2e000 65 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c  ert( WHERE_USE_L
2e010 49 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69  IMIT==SF_FixedLi
2e020 6d 69 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c  mit );.    wctrl
2e030 46 6c 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46  Flags |= p->selF
2e040 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c  lags & SF_FixedL
2e050 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  imit;..    /* Be
2e060 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
2e070 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57   scan. */.    pW
2e080 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
2e090 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
2e0a0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
2e0b0 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  e, sSort.pOrderB
2e0c0 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
2e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0e0 20 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74    p->pEList, wct
2e0f0 72 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c  rlFlags, p->nSel
2e100 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28  ectRow);.    if(
2e110 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
2e120 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2e130 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2e140 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
2e150 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53  (pWInfo) < p->nS
2e160 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20  electRow ){.    
2e170 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
2e180 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  = sqlite3WhereOu
2e190 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
2e1a0 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
2e1b0 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73  if( sDistinct.is
2e1c0 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57  Tnct && sqlite3W
2e1d0 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
2e1e0 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
2e1f0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2e200 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ype = sqlite3Whe
2e210 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
2e220 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nfo);.    }.    
2e230 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  if( sSort.pOrder
2e240 42 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  By ){.      sSor
2e250 74 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74  t.nOBSat = sqlit
2e260 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
2e270 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2e280 73 53 6f 72 74 2e 62 4f 72 64 65 72 65 64 49 6e  sSort.bOrderedIn
2e290 6e 65 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65  nerLoop = sqlite
2e2a0 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
2e2b0 65 72 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a  erLoop(pWInfo);.
2e2c0 20 20 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e        if( sSort.
2e2d0 6e 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f  nOBSat==sSort.pO
2e2e0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
2e2f0 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70  .        sSort.p
2e300 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
2e310 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2e320 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e  /* If sorting in
2e330 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65  dex that was cre
2e340 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
2e350 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2e360 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63   .    ** instruc
2e370 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f  tion ended up no
2e380 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20  t being needed, 
2e390 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
2e3a0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2e3b0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20  .    ** into an 
2e3c0 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  OP_Noop..    */.
2e3d0 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64      if( sSort.ad
2e3e0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
2e3f0 26 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  & sSort.pOrderBy
2e400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2e410 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
2e420 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
2e430 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
2e440 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20    }..    /* Use 
2e450 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e  the standard inn
2e460 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20  er loop. */.    
2e470 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
2e480 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73  pParse, p, pELis
2e490 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26  t, -1, &sSort, &
2e4a0 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
2e4b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e4c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2e4d0 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28  reContinueLabel(
2e4e0 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  pWInfo),.       
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2e500 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
2e510 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20  bel(pWInfo));.. 
2e520 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61     /* End the da
2e530 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
2e540 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
2e550 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2e560 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
2e570 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
2e580 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74  when there exist
2e590 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
2e5a0 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20  ions or a GROUP 
2e5b0 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  BY clause.    **
2e5c0 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20   or both */.    
2e5d0 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
2e5e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
2e5f0 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
2e600 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
2e610 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
2e620 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
2e630 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
2e640 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
2e650 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
2e660 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
2e670 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
2e680 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
2e690 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
2e6a0 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
2e6b0 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
2e6c0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
2e6d0 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
2e6e0 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
2e6f0 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e710 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
2e720 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
2e730 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
2e740 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
2e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
2e760 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
2e770 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
2e780 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
2e790 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
2e7a0 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
2e7b0 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
2e7c0 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
2e7d0 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
2e7e0 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
2e7f0 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
2e800 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
2e810 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  End;        /* E
2e820 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  nd of processing
2e830 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
2e840 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
2e850 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50  PTab = 0;   /* P
2e860 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20  seudotable used 
2e870 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e  to decode sortin
2e880 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  g results */.   
2e890 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30   int sortOut = 0
2e8a0 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72  ;    /* Output r
2e8b0 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65  egister from the
2e8c0 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69   sorter */.    i
2e8d0 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20  nt orderByGrp = 
2e8e0 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  0; /* True if th
2e8f0 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f  e GROUP BY and O
2e900 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20  RDER BY are the 
2e910 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  same */..    /* 
2e920 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61  Remove any and a
2e930 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65  ll aliases betwe
2e940 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  en the result se
2e950 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  t and the.    **
2e960 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
2e970 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2e980 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
2e990 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
2e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e9b0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
2e9c0 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
2e9d0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
2e9e0 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c  pItem;  /* For l
2e9f0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72  ooping over expr
2ea00 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74  ession in a list
2ea10 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b   */..      for(k
2ea20 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
2ea30 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69  r, pItem=p->pELi
2ea40 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  st->a; k>0; k--,
2ea50 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2ea60 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
2ea70 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
2ea80 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47  }.      for(k=pG
2ea90 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70  roupBy->nExpr, p
2eaa0 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
2eab0 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
2eac0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
2ead0 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
2eae0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
2eaf0 20 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73     assert( 66==s
2eb00 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30  qlite3LogEst(100
2eb10 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
2eb20 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20  ->nSelectRow>66 
2eb30 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
2eb40 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 66;.    }else{
2eb50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
2eb60 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
2eb70 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  1) );.      p->n
2eb80 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
2eb90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2eba0 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20  there is both a 
2ebb0 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20  GROUP BY and an 
2ebc0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2ebd0 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20  and they are.   
2ebe0 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74   ** identical, t
2ebf0 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f  hen it may be po
2ec00 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c  ssible to disabl
2ec10 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
2ec20 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e  lause .    ** on
2ec30 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61   the grounds tha
2ec40 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77  t the GROUP BY w
2ec50 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e  ill cause elemen
2ec60 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a  ts to come out .
2ec70 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f      ** in the co
2ec80 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20  rrect order. It 
2ec90 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74  also may not - t
2eca0 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68  he GROUP BY migh
2ecb0 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64  t use a.    ** d
2ecc0 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68  atabase index th
2ecd0 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74  at causes rows t
2ece0 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67  o be grouped tog
2ecf0 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65  ether as require
2ed00 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74  d.    ** but not
2ed10 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64   actually sorted
2ed20 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65  . Either way, re
2ed30 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
2ed40 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52  at the.    ** OR
2ed50 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50  DER BY and GROUP
2ed60 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20   BY clauses are 
2ed70 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74  the same by sett
2ed80 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47  ing the orderByG
2ed90 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  rp.    ** variab
2eda0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
2edb0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
2edc0 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c  ompare(pGroupBy,
2edd0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
2ede0 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
2edf0 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b   orderByGrp = 1;
2ee00 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
2ee10 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74  Create a label t
2ee20 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77  o jump to when w
2ee30 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20  e want to abort 
2ee40 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  the query */.   
2ee50 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74   addrEnd = sqlit
2ee60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2ee70 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  v);..    /* Conv
2ee80 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ert TK_COLUMN no
2ee90 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  des into TK_AGG_
2eea0 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20  COLUMN and make 
2eeb0 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a  entries in.    *
2eec0 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61  * sAggInfo for a
2eed0 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ll TK_AGG_FUNCTI
2eee0 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72  ON nodes in expr
2eef0 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
2ef00 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
2ef10 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
2ef20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
2ef30 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
2ef40 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
2ef50 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
2ef60 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
2ef70 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70  bList;.    sNC.p
2ef80 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49  AggInfo = &sAggI
2ef90 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  nfo;.    sAggInf
2efa0 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65  o.mnReg = pParse
2efb0 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41  ->nMem+1;.    sA
2efc0 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
2efd0 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
2efe0 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
2eff0 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  pr : 0;.    sAgg
2f000 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
2f010 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71  pGroupBy;.    sq
2f020 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
2f030 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
2f040 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
2f050 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
2f060 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74  List(&sNC, sSort
2f070 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
2f080 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
2f090 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2f0a0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
2f0b0 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
2f0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
2f0d0 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
2f0e0 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
2f0f0 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  lumn;.    for(i=
2f100 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46  0; i<sAggInfo.nF
2f110 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unc; i++){.     
2f120 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2f130 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e  sProperty(sAggIn
2f140 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
2f150 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2f160 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63   );.      sNC.nc
2f170 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67  Flags |= NC_InAg
2f180 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  gFunc;.      sql
2f190 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
2f1a0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67  ggList(&sNC, sAg
2f1b0 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
2f1c0 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
2f1d0 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
2f1e0 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75  s &= ~NC_InAggFu
2f1f0 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41  nc;.    }.    sA
2f200 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70  ggInfo.mxReg = p
2f210 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2f220 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
2f230 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
2f240 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
2f250 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
2f260 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
2f270 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
2f280 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
2f290 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
2f2a0 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
2f2b0 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
2f2c0 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
2f2d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
2f2e0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
2f2f0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
2f300 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
2f310 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
2f320 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
2f330 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
2f340 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  1;          /* A
2f350 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
2f360 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
2f370 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
2f380 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
2f390 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
2f3a0 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
2f3b0 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
2f3c0 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
2f3d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
2f3e0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
2f3f0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
2f400 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
2f410 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
2f420 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
2f430 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
2f440 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2f450 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
2f460 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
2f470 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
2f480 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
2f490 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
2f4a0 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
2f4b0 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2f4c0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
2f4d0 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
2f4e0 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
2f4f0 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
2f500 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
2f510 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
2f520 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
2f530 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2f540 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
2f550 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
2f560 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2f570 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
2f580 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
2f590 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
2f5a0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
2f5b0 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
2f5c0 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
2f5d0 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
2f5e0 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
2f5f0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
2f600 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
2f610 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f  ter all, the OP_
2f620 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72  SorterOpen instr
2f630 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
2f640 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
2f650 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
2f660 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2f670 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2f680 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
2f690 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
2f6a0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
2f6b0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
2f6c0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  e, pGroupBy, 0, 
2f6d0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2f6e0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
2f6f0 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
2f700 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2f710 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
2f720 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
2f730 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
2f740 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
2f750 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
2f760 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
2f770 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
2f780 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
2f790 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
2f7a0 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
2f7b0 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67   GROUP BY aggreg
2f7c0 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20  ate processing. 
2f7d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55       */.      iU
2f7e0 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  seFlag = ++pPars
2f7f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
2f800 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50  AbortFlag = ++pP
2f810 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2f820 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d    regOutputRow =
2f830 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2f840 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
2f850 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
2f860 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2f870 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d        regReset =
2f880 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2f890 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74  .      addrReset
2f8a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
2f8b0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
2f8c0 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65    iAMem = pParse
2f8d0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
2f8e0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2f8f0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2f900 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d  r;.      iBMem =
2f910 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
2f920 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  1;.      pParse-
2f930 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42  >nMem += pGroupB
2f940 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  y->nExpr;.      
2f950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2f960 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
2f970 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   0, iAbortFlag);
2f980 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2f990 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62  nt((v, "clear ab
2f9a0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
2f9b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2f9c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2f9d0 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29  er, 0, iUseFlag)
2f9e0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2f9f0 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74  ent((v, "indicat
2fa00 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d  e accumulator em
2fa10 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71  pty"));.      sq
2fa20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2fa30 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69  v, OP_Null, 0, i
2fa40 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f  AMem, iAMem+pGro
2fa50 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a  upBy->nExpr-1);.
2fa60 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  .      /* Begin 
2fa70 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c  a loop that will
2fa80 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75   extract all sou
2fa90 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55  rce rows in GROU
2faa0 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20  P BY order..    
2fab0 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20    ** This might 
2fac0 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61  involve two sepa
2fad0 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20  rate loops with 
2fae0 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65  an OP_Sort in be
2faf0 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20  tween, or.      
2fb00 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ** it might be a
2fb10 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61   single loop tha
2fb20 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20  t uses an index 
2fb30 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72  to extract infor
2fb40 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  mation.      ** 
2fb50 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64  in the right ord
2fb60 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68  er to begin with
2fb70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2fb80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2fb90 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
2fba0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
2fbb0 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  set);.      pWIn
2fbc0 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
2fbd0 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
2fbe0 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
2fbf0 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20   pGroupBy, 0,.  
2fc00 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47 52          WHERE_GR
2fc10 4f 55 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79  OUPBY | (orderBy
2fc20 47 72 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54  Grp ? WHERE_SORT
2fc30 42 59 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a  BYGROUP : 0), 0.
2fc40 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
2fc50 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
2fc60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2fc70 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2fc80 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
2fc90 70 57 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42  pWInfo)==pGroupB
2fca0 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
2fcb0 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d      /* The optim
2fcc0 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20  izer is able to 
2fcd0 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
2fce0 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73  group by order s
2fcf0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20  o.        ** we 
2fd00 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73  do not have to s
2fd10 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65  ort.  The OP_Ope
2fd20 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65  nEphemeral table
2fd30 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
2fd40 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61   ** cancelled la
2fd50 74 65 72 20 62 65 63 61 75 73 65 20 77 65 20 73  ter because we s
2fd60 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65  till need to use
2fd70 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20   the pKeyInfo.  
2fd80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2fd90 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30   groupBySort = 0
2fda0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2fdb0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61         /* Rows a
2fdc0 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e  re coming out in
2fdd0 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72   undetermined or
2fde0 64 65 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  der.  We have to
2fdf0 20 70 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a   push.        **
2fe00 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61   each row into a
2fe10 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20   sorting index, 
2fe20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69  terminate the fi
2fe30 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20  rst loop,.      
2fe40 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f    ** then loop o
2fe50 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20  ver the sorting 
2fe60 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74  index in order t
2fe70 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  o get the output
2fe80 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73  .        ** in s
2fe90 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20  orted order.    
2fea0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2feb0 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20  nt regBase;.    
2fec0 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72      int regRecor
2fed0 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
2fee0 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Col;.        int
2fef0 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20   nGroupBy;..    
2ff00 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
2ff10 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20  able(pParse, .  
2ff20 20 20 20 20 20 20 20 20 20 20 28 73 44 69 73 74            (sDist
2ff30 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28  inct.isTnct && (
2ff40 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44  p->selFlags&SF_D
2ff50 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20  istinct)==0) ?. 
2ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff70 20 20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20     "DISTINCT" : 
2ff80 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20  "GROUP BY");..  
2ff90 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
2ffa0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
2ffb0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
2ffc0 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
2ffd0 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
2ffe0 42 79 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  By;.        j = 
2fff0 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20  nGroupBy;.      
30000 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
30010 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
30020 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
30030 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
30040 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
30050 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
30060 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
30070 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
30080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30090 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
300a0 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
300b0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
300c0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
300d0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
300e0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
300f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
30100 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
30110 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
30120 20 72 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b   regBase, 0, 0);
30130 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
30140 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66  oupBy;.        f
30150 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
30160 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
30170 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
30180 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
30190 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
301a0 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
301b0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
301c0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
301d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
301e0 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
301f0 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
30200 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
30210 65 74 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50  etColumnToReg(pP
30220 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
30230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30240 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
30250 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
30260 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
30270 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
30280 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
30290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
302a0 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73     regRecord = s
302b0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
302c0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
302d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
302e0 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
302f0 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e  cord, regBase, n
30300 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
30310 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30320 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
30330 5f 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73  _SorterInsert, s
30340 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
30350 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
30360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
30370 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
30380 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
30390 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
303a0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
303b0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
303c0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
303d0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
303e0 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
303f0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
30400 69 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72  ingIdxPTab = sor
30410 74 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  tPTab = pParse->
30420 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
30430 73 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65  sortOut = sqlite
30440 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
30450 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
30460 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
30470 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
30480 20 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f   sortPTab, sortO
30490 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  ut, nCol);.     
304a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
304b0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
304c0 72 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rSort, sAggInfo.
304d0 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
304e0 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64  End);.        Vd
304f0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
30500 52 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b  ROUP BY sort"));
30510 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
30520 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e  ;.        sAggIn
30530 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78  fo.useSortingIdx
30540 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71   = 1;.        sq
30550 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
30560 65 61 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  ear(pParse);..  
30570 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
30580 49 66 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20  If the index or 
30590 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
305a0 75 73 65 64 20 62 79 20 74 68 65 20 47 52 4f 55  used by the GROU
305b0 50 20 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20  P BY sort.      
305c0 2a 2a 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c  ** will naturall
305d0 79 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  y deliver rows i
305e0 6e 20 74 68 65 20 6f 72 64 65 72 20 72 65 71 75  n the order requ
305f0 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 44 45  ired by the ORDE
30600 52 20 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c  R BY.      ** cl
30610 61 75 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65  ause, cancel the
30620 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
30630 20 6f 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c   open coded earl
30640 69 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ier..      **.  
30650 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61      ** This is a
30660 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
30670 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
30680 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
30690 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
306a0 20 20 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53      ** Use the S
306b0 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
306c0 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c  er flag with SQL
306d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
306e0 49 4d 49 5a 45 52 20 74 6f 20 0a 20 20 20 20 20  IMIZER to .     
306f0 20 2a 2a 20 64 69 73 61 62 6c 65 20 74 68 69 73   ** disable this
30700 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
30710 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
30720 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66  es.  */.      if
30730 28 20 6f 72 64 65 72 42 79 47 72 70 20 26 26 20  ( orderByGrp && 
30740 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
30750 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
30760 72 6f 75 70 42 79 4f 72 64 65 72 29 20 0a 20 20  roupByOrder) .  
30770 20 20 20 20 20 26 26 20 28 67 72 6f 75 70 42 79       && (groupBy
30780 53 6f 72 74 20 7c 7c 20 73 71 6c 69 74 65 33 57  Sort || sqlite3W
30790 68 65 72 65 49 73 53 6f 72 74 65 64 28 70 57 49  hereIsSorted(pWI
307a0 6e 66 6f 29 29 0a 20 20 20 20 20 20 29 7b 0a 20  nfo)).      ){. 
307b0 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72         sSort.pOr
307c0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
307d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
307e0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
307f0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
30800 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  x);.      }..   
30810 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
30820 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
30830 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
30840 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
30850 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
30860 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
30870 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
30880 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
30890 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
308a0 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
308b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
308c0 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
308d0 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
308e0 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
308f0 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
30900 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
30910 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
30920 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
30930 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
30940 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
30950 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
30960 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
30970 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
30980 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
30990 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
309a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
309b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
309c0 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
309d0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
309e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
309f0 20 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 4f             sortO
30a00 75 74 2c 20 73 6f 72 74 50 54 61 62 29 3b 0a 20  ut, sortPTab);. 
30a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
30a20 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79  (j=0; j<pGroupBy
30a30 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
30a40 20 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70         if( group
30a50 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
30a60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30a70 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
30a80 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c  mn, sortPTab, j,
30a90 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
30aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30ab0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72      sAggInfo.dir
30ac0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20  ectMode = 1;.   
30ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
30ae0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
30af0 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45  GroupBy->a[j].pE
30b00 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  xpr, iBMem+j);. 
30b10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30b30 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
30b40 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69  ompare, iAMem, i
30b50 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  BMem, pGroupBy->
30b60 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  nExpr,.         
30b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b80 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
30b90 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
30ba0 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
30bb0 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
30bc0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
30bd0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
30be0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30bf0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
30c00 64 64 72 31 2b 31 2c 20 30 2c 20 61 64 64 72 31  ddr1+1, 0, addr1
30c10 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  +1); VdbeCoverag
30c20 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  e(v);..      /* 
30c30 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
30c40 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
30c50 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
30c60 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
30c70 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47  Changes in the G
30c80 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65  ROUP BY are dete
30c90 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  cted by the prev
30ca0 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20  ious code.      
30cb0 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68  ** block.  If th
30cc0 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e  ere were no chan
30cd0 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20  ges, this block 
30ce0 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  is skipped..    
30cf0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
30d00 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63  is code copies c
30d10 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20  urrent group by 
30d20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62  terms in b0,b1,b
30d30 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f  2,....      ** o
30d40 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e  ver to a0,a1,a2.
30d50 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20    It then calls 
30d60 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
30d70 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61  utine.      ** a
30d80 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67  nd resets the ag
30d90 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
30da0 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e  tor registers in
30db0 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20   preparation.   
30dc0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65     ** for the ne
30dd0 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63  xt GROUP BY batc
30de0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
30df0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
30e00 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42  eMove(pParse, iB
30e10 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f  Mem, iAMem, pGro
30e20 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  upBy->nExpr);.  
30e30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
30e40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
30e50 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
30e60 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
30e70 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
30e80 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f  nt((v, "output o
30e90 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  ne row"));.     
30ea0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30eb0 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
30ec0 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
30ed0 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61  End); VdbeCovera
30ee0 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62  ge(v);.      Vdb
30ef0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68  eComment((v, "ch
30f00 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29  eck abort flag")
30f10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30f20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
30f30 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74  _Gosub, regReset
30f40 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20  , addrReset);.  
30f50 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
30f60 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d  (v, "reset accum
30f70 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
30f80 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
30f90 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
30fa0 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20  lators based on 
30fb0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20  the content of. 
30fc0 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72       ** the curr
30fd0 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f  ent row.      */
30fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30ff0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
31000 64 72 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61  dr1);.      upda
31010 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
31020 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
31030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
31040 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
31050 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
31060 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
31070 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
31080 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
31090 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
310a0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
310b0 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
310c0 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
310d0 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
310e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
310f0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
31100 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rNext, sAggInfo.
31110 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
31120 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
31130 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
31140 28 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (v);.      }else
31150 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31160 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
31170 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
31180 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
31190 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e  op(v, addrSortin
311a0 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  gIdx);.      }..
311b0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
311c0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
311d0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
311e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
311f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
31200 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
31210 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
31220 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
31230 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
31240 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
31250 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
31260 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
31270 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
31280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
31290 74 6f 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a  to(v, addrEnd);.
312a0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
312b0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
312c0 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
312d0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
312e0 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
312f0 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
31300 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
31310 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
31320 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
31330 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
31340 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
31350 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
31360 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
31370 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
31380 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
31390 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
313a0 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
313b0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
313c0 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
313d0 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
313e0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
313f0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
31400 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
31410 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
31420 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
31430 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
31440 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
31450 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
31460 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
31470 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31480 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
31490 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
314a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
314b0 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
314c0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
314d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
314e0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
314f0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
31500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
31510 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
31520 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
31530 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
31540 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
31550 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
31560 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
31570 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
31580 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
31590 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
315a0 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
315b0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
315c0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
315d0 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c  , "Groupby resul
315e0 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72  t generator entr
315f0 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20  y point"));.    
31600 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31610 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
31620 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
31630 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41  .      finalizeA
31640 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72  ggFunctions(pPar
31650 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
31660 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
31670 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
31680 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
31690 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
316a0 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
316b0 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
316c0 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
316d0 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 26  p->pEList, -1, &
316e0 73 53 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20  sSort,.         
316f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44               &sD
31700 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31720 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
31730 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
31740 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
31750 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
31760 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
31770 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
31780 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
31790 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
317a0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
317b0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
317c0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
317d0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
317e0 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
317f0 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
31800 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
31810 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
31820 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
31830 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
31840 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
31850 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
31860 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
31870 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
31880 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
31890 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
318a0 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65  if pGroupBy.  Be
318b0 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75  gin aggregate qu
318c0 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52  eries without GR
318d0 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65  OUP BY: */.    e
318e0 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
318f0 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
31900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31910 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
31920 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
31930 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
31940 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e  b = isSimpleCoun
31950 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29  t(p, &sAggInfo))
31960 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
31970 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75  * If isSimpleCou
31980 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70  nt() returns a p
31990 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
319a0 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  e structure, the
319b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
319c0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
319d0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
319e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
319f0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f    **   SELECT co
31a00 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
31a10 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  >.        **.   
31a20 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68       ** where th
31a30 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
31a40 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65  e returned repre
31a50 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c  sents table <tbl
31a60 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  >..        **.  
31a70 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74        ** This st
31a80 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f  atement is so co
31a90 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20  mmon that it is 
31aa0 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61  optimized specia
31ab0 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20  lly. The.       
31ac0 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73   ** OP_Count ins
31ad0 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63  truction is exec
31ae0 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74  uted either on t
31af0 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  he intkey table 
31b00 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
31b10 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
31b20 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c  a for table <tbl
31b30 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69  > or on one of i
31b40 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20  ts indexes. It. 
31b50 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74         ** is bet
31b60 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74  ter to execute t
31b70 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65  he op on an inde
31b80 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72  x, as indexes ar
31b90 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20  e almost.       
31ba0 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61   ** always sprea
31bb0 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61  d across less pa
31bc0 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63  ges than their c
31bd0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
31be0 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  les..        */.
31bf0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
31c00 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
31c10 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
31c20 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
31c30 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
31c40 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20   const int iCsr 
31c50 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
31c60 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
31c70 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a  to scan b-tree *
31c80 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
31c90 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31cb0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
31cc0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b  ble */.        K
31cd0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
31ce0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31cf0 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66      /* Keyinfo f
31d00 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78  or scanned index
31d10 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
31d20 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
31d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d40 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66   /* Best index f
31d50 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ound so far */. 
31d60 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74         int iRoot
31d70 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20   = pTab->tnum;  
31d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
31d90 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e  oot page of scan
31da0 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  ned b-tree */.. 
31db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
31dc0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
31dd0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
31de0 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
31df0 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
31e00 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
31e10 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
31e20 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
31e30 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ch for the index
31e40 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f   that has the lo
31e50 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a  west scan cost..
31e60 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31e70 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31     ** (2011-04-1
31e80 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66  5) Do not do a f
31e90 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75  ull scan of an u
31ea0 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a  nordered index..
31eb0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31ec0 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30     ** (2013-10-0
31ed0 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20  3) Do not count 
31ee0 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61  the entries in a
31ef0 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a   partial index..
31f00 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
31f10 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63     ** In practic
31f20 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  e the KeyInfo st
31f30 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74  ructure will not
31f40 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20   be used. It is 
31f50 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  only .        **
31f60 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20   passed to keep 
31f70 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70  OP_OpenRead happ
31f80 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
31f90 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
31fa0 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73  wid(pTab) ) pBes
31fb0 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  t = sqlite3Prima
31fc0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
31fd0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
31fe0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
31ff0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
32000 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
32010 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55      if( pIdx->bU
32020 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
32030 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
32040 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
32050 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20  zTabRow.        
32060 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72     && pIdx->pPar
32070 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20  tIdxWhere==0.   
32080 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65          && (!pBe
32090 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64  st || pIdx->szId
320a0 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64  xRow<pBest->szId
320b0 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20  xRow).          
320c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
320d0 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
320e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
320f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
32100 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
32110 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d    iRoot = pBest-
32120 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  >tnum;.         
32130 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
32140 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
32150 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  x(pParse, pBest)
32160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
32170 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
32180 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
32190 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
321a0 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
321b0 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
321c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
321d0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
321e0 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69  penRead, iCsr, i
321f0 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20  Root, iDb, 1);. 
32200 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
32210 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
32220 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
32230 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
32240 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  r *)pKeyInfo, P4
32250 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
32260 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
32270 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
32280 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72  , OP_Count, iCsr
32290 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
322a0 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  [0].iMem);.     
322b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
322c0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
322d0 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20  , iCsr);.       
322e0 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
322f0 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  unt(pParse, pTab
32300 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
32310 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
32320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
32330 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
32340 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
32350 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
32360 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
32370 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
32380 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
32390 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
323a0 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
323b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
323c0 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
323d0 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
323e0 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
323f0 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
32400 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
32410 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
32420 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
32430 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
32440 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
32450 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
32460 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
32470 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
32480 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
32490 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
324a0 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
324b0 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
324c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
324d0 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
324e0 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
324f0 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
32500 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
32510 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
32520 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
32530 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
32540 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
32550 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
32560 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
32570 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
32580 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
32590 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
325a0 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
325b0 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
325c0 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
325d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
325e0 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
325f0 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
32600 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
32610 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
32620 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
32630 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c   behavior as fol
32640 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
32650 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
32660 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
32670 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
32680 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
32690 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
326a0 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
326b0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
326c0 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
326d0 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
326e0 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
326f0 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
32700 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
32710 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
32720 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
32730 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
32740 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
32750 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
32760 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
32770 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
32780 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
32790 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
327a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
327b0 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
327c0 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
327d0 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
327e0 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
327f0 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
32800 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
32810 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
32820 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
32830 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
32840 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
32850 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
32860 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45   u8 flag = WHERE
32870 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
32880 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
32890 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
328a0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
328b0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
328c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
328d0 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  f( p->pHaving==0
328e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
328f0 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
32900 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69  (&sAggInfo, &pMi
32910 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  nMax);.        }
32920 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32930 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69   flag==0 || (pMi
32940 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d  nMax!=0 && pMinM
32950 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b  ax->nExpr==1) );
32960 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ..        if( fl
32970 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
32980 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
32990 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
329a0 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20   pMinMax, 0);.  
329b0 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
329c0 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
329d0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
329e0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 4d  llocFailed || pM
329f0 69 6e 4d 61 78 21 3d 30 20 29 3b 0a 20 20 20 20  inMax!=0 );.    
32a00 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
32a10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
32a20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
32a30 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  ax->a[0].sortOrd
32a40 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45  er = flag!=WHERE
32a50 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a  _ORDERBY_MIN ?1:
32a60 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
32a70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78  MinMax->a[0].pEx
32a80 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
32a90 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  MN;.          }.
32aa0 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
32ab0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
32ac0 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
32ad0 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
32ae0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
32af0 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
32b00 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
32b10 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
32b20 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
32b30 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
32b40 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
32b50 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
32b60 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
32b70 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
32b80 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
32b90 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
32ba0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
32bb0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
32bc0 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 20  Where, pMinMax, 
32bd0 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20  0,flag,0);.     
32be0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
32bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
32c00 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
32c10 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
32c20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
32c30 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
32c40 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61    }.        upda
32c50 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
32c60 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
32c70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
32c80 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  ( pMinMax==0 || 
32c90 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d  pMinMax->nExpr==
32ca0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
32cb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
32cc0 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3e 30  rdered(pWInfo)>0
32cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
32ce0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
32cf0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
32d00 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
32d10 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
32d20 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
32d30 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20  ) by index",.   
32d40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
32d50 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
32d60 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
32d70 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
32d80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
32d90 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
32da0 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
32db0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
32dc0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
32dd0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32de0 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
32df0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
32e00 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
32e10 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
32e20 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
32e30 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
32e40 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
32e50 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
32e60 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30  pEList, -1, 0, 0
32e70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
32e80 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20           pDest, 
32e90 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
32ea0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32eb0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
32ec0 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a  b, pDel);.    }.
32ed0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
32ee0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
32ef0 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20  ddrEnd);.    .  
32f00 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65  } /* endif aggre
32f10 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20  gate query */.. 
32f20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65   if( sDistinct.e
32f30 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
32f40 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
32f50 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  ED ){.    explai
32f60 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
32f70 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a  e, "DISTINCT");.
32f80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
32f90 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
32fa0 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77  Y clause, then w
32fb0 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74  e need to sort t
32fc0 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
32fd0 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f  and send them to
32fe0 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
32ff0 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  e by one..  */. 
33000 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
33010 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  rBy ){.    expla
33020 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
33030 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
33040 20 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 6e           sSort.n
33050 4f 42 53 61 74 3e 30 20 3f 20 22 52 49 47 48 54  OBSat>0 ? "RIGHT
33060 20 50 41 52 54 20 4f 46 20 4f 52 44 45 52 20 42   PART OF ORDER B
33070 59 22 3a 22 4f 52 44 45 52 20 42 59 22 29 3b 0a  Y":"ORDER BY");.
33080 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
33090 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
330a0 26 73 53 6f 72 74 2c 20 70 45 4c 69 73 74 2d 3e  &sSort, pEList->
330b0 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20  nExpr, pDest);. 
330c0 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65   }..  /* Jump he
330d0 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
330e0 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
330f0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
33100 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
33110 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
33120 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 2e 20  has been coded. 
33130 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  If there is an e
33140 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73  rror in the Pars
33150 65 20 73 74 72 75 63 74 75 72 65 2c 0a 20 20 2a  e structure,.  *
33160 2a 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  * set the return
33170 20 63 6f 64 65 20 74 6f 20 31 2e 20 4f 74 68 65   code to 1. Othe
33180 72 77 69 73 65 20 30 2e 20 2a 2f 0a 20 20 72 63  rwise 0. */.  rc
33190 20 3d 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72   = (pParse->nErr
331a0 3e 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72  >0);..  /* Contr
331b0 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65  ol jumps to here
331c0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
331d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76  encountered abov
331e0 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20  e, or upon.  ** 
331f0 73 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e  successful codin
33200 67 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e  g of the SELECT.
33210 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64  .  */.select_end
33220 3a 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  :.  explainSetIn
33230 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53  teger(pParse->iS
33240 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72  electId, iRestor
33250 65 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f  eSelectId);..  /
33260 2a 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d  * Identify colum
33270 6e 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c  n names if resul
33280 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
33290 20 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75   are to be outpu
332a0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  t..  */.  if( rc
332b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
332c0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
332d0 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67  _Output ){.    g
332e0 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
332f0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  es(pParse, pTabL
33300 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ist, pEList);.  
33310 7d 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  }..  sqlite3DbFr
33320 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e  ee(db, sAggInfo.
33330 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  aCol);.  sqlite3
33340 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
33350 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23 69 66 20  nfo.aFunc);.#if 
33360 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
33370 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43  LED.  SELECTTRAC
33380 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65  E(1,pParse,p,("e
33390 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22  nd processing\n"
333a0 29 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53  ));.  pParse->nS
333b0 65 6c 65 63 74 49 6e 64 65 6e 74 2d 2d 3b 0a 23  electIndent--;.#
333c0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
333d0 63 3b 0a 7d 0a                                   c;.}.