/ Hex Artifact Content
Login

Artifact 4588dcfb0fa430012247a209ba08e17904dd32ec7690e9cb6c85e0ef012b0518:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 2a 73 25 73 2e 25 70 3a 20 22 2c 28 50 29  "%*s%s.%p: ",(P)
02c0: 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74 2a  ->nSelectIndent*
02d0: 32 2d 32 2c 22 22 2c 5c 0a 20 20 20 20 20 20 20  2-2,"",\.       
02e0: 20 28 53 29 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28   (S)->zSelName,(
02f0: 53 29 29 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65  S)),\.    sqlite
0300: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23  3DebugPrintf X.#
0310: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 53 45  else.# define SE
0320: 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c  LECTTRACE(K,P,S,
0330: 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  X).#endif.../*.*
0340: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0350: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0360: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0370: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0380: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
0390: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
03a0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
03b0: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
03c0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
03d0: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
03e0: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
03f0: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
0400: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0410: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
0420: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
0430: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
0440: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
0450: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
0460: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0470: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0480: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
0490: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
04a0: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
04b0: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
04c0: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
04d0: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
04e0: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
04f0: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
0500: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
0510: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
0520: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
0530: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
0540: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
0550: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
0570: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
0580: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
0590: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  ion about.** the
05a0: 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
05b0: 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 20 6f  OUP BY) clause o
05c0: 66 20 71 75 65 72 79 20 69 73 20 62 65 69 6e 67  f query is being
05d0: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 74 79 70 65 64   coded..*/.typed
05e0: 65 66 20 73 74 72 75 63 74 20 53 6f 72 74 43 74  ef struct SortCt
05f0: 78 20 53 6f 72 74 43 74 78 3b 0a 73 74 72 75 63  x SortCtx;.struc
0600: 74 20 53 6f 72 74 43 74 78 20 7b 0a 20 20 45 78  t SortCtx {.  Ex
0610: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
0620: 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ;   /* The ORDER
0630: 20 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59   BY (or GROUP BY
0640: 20 63 6c 61 75 73 65 29 20 2a 2f 0a 20 20 69 6e   clause) */.  in
0650: 74 20 6e 4f 42 53 61 74 3b 20 20 20 20 20 20 20  t nOBSat;       
0660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
0670: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
0680: 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e 64  satisfied by ind
0690: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ices */.  int iE
06a0: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
06b0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
06c0: 20 66 6f 72 20 74 68 65 20 73 6f 72 74 65 72 20   for the sorter 
06d0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
06e0: 72 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65  rn;        /* Re
06f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 62  gister holding b
0700: 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 72 65 74 75  lock-output retu
0710: 72 6e 20 61 64 64 72 65 73 73 20 2a 2f 0a 20 20  rn address */.  
0720: 69 6e 74 20 6c 61 62 65 6c 42 6b 4f 75 74 3b 20  int labelBkOut; 
0730: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6c        /* Start l
0740: 61 62 65 6c 20 66 6f 72 20 74 68 65 20 62 6c 6f  abel for the blo
0750: 63 6b 2d 6f 75 74 70 75 74 20 73 75 62 72 6f 75  ck-output subrou
0760: 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
0770: 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
0780: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
0790: 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20  e OP_SorterOpen 
07a0: 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  or OP_OpenEpheme
07b0: 72 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  ral */.  int lab
07c0: 65 6c 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 2f  elDone;        /
07d0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
07e0: 20 64 6f 6e 65 2c 20 65 78 3a 20 4c 49 4d 49 54   done, ex: LIMIT
07f0: 20 72 65 61 63 68 65 64 20 2a 2f 0a 20 20 75 38   reached */.  u8
0800: 20 73 6f 72 74 46 6c 61 67 73 3b 20 20 20 20 20   sortFlags;     
0810: 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
0820: 6f 72 65 20 53 4f 52 54 46 4c 41 47 5f 2a 20 62  ore SORTFLAG_* b
0830: 69 74 73 20 2a 2f 0a 20 20 75 38 20 62 4f 72 64  its */.  u8 bOrd
0840: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 20 2f  eredInnerLoop; /
0850: 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 72 72 65  * ORDER BY corre
0860: 63 74 6c 79 20 73 6f 72 74 73 20 74 68 65 20 69  ctly sorts the i
0870: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 7d 3b 0a  nner loop */.};.
0880: 23 64 65 66 69 6e 65 20 53 4f 52 54 46 4c 41 47  #define SORTFLAG
0890: 5f 55 73 65 53 6f 72 74 65 72 20 20 30 78 30 31  _UseSorter  0x01
08a0: 20 20 20 2f 2a 20 55 73 65 20 53 6f 72 74 65 72     /* Use Sorter
08b0: 4f 70 65 6e 20 69 6e 73 74 65 61 64 20 6f 66 20  Open instead of 
08c0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 2a 2f  OpenEphemeral */
08d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
08e0: 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ll the content o
08f0: 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63  f a Select struc
0900: 74 75 72 65 2e 20 20 44 65 61 6c 6c 6f 63 61 74  ture.  Deallocat
0910: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
0920: 2a 2a 20 69 74 73 65 6c 66 20 6f 6e 6c 79 20 69  ** itself only i
0930: 66 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2e  f bFree is true.
0940: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0950: 63 6c 65 61 72 53 65 6c 65 63 74 28 73 71 6c 69  clearSelect(sqli
0960: 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20  te3 *db, Select 
0970: 2a 70 2c 20 69 6e 74 20 62 46 72 65 65 29 7b 0a  *p, int bFree){.
0980: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
0990: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
09a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
09b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
09c0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
09d0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
09e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
09f0: 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20  (db, p->pSrc);. 
0a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
0a10: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 68 65  lete(db, p->pWhe
0a20: 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  re);.    sqlite3
0a30: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
0a40: 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  b, p->pGroupBy);
0a50: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0a60: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 48  Delete(db, p->pH
0a70: 61 76 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69  aving);.    sqli
0a80: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
0a90: 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
0aa0: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
0ab0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
0ac0: 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71  >pLimit);.    sq
0ad0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0ae0: 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b  db, p->pOffset);
0af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57 69 74  .    if( p->pWit
0b00: 68 20 29 20 73 71 6c 69 74 65 33 57 69 74 68 44  h ) sqlite3WithD
0b10: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 57 69  elete(db, p->pWi
0b20: 74 68 29 3b 0a 20 20 20 20 69 66 28 20 62 46 72  th);.    if( bFr
0b30: 65 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ee ) sqlite3DbFr
0b40: 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 20 20 20  eeNN(db, p);.   
0b50: 20 70 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20   p = pPrior;.   
0b60: 20 62 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 0a   bFree = 1;.  }.
0b70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0b80: 69 7a 65 20 61 20 53 65 6c 65 63 74 44 65 73 74  ize a SelectDest
0b90: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76   structure..*/.v
0ba0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0bb0: 74 44 65 73 74 49 6e 69 74 28 53 65 6c 65 63 74  tDestInit(Select
0bc0: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 69 6e 74  Dest *pDest, int
0bd0: 20 65 44 65 73 74 2c 20 69 6e 74 20 69 50 61 72   eDest, int iPar
0be0: 6d 29 7b 0a 20 20 70 44 65 73 74 2d 3e 65 44 65  m){.  pDest->eDe
0bf0: 73 74 20 3d 20 28 75 38 29 65 44 65 73 74 3b 0a  st = (u8)eDest;.
0c00: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
0c10: 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70 44 65 73   = iParm;.  pDes
0c20: 74 2d 3e 7a 41 66 66 53 64 73 74 20 3d 20 30 3b  t->zAffSdst = 0;
0c30: 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
0c40: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53  = 0;.  pDest->nS
0c50: 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  dst = 0;.}.../*.
0c60: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
0c70: 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75  w Select structu
0c80: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  re and return a 
0c90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 0a  pointer to that.
0ca0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
0cb0: 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33  .Select *sqlite3
0cc0: 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61 72  SelectNew(.  Par
0cd0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
0ce0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
0cf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
0d00: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
0d10: 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e   /* which column
0d20: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
0d30: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
0d40: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
0d50: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
0d60: 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69 63  M clause -- whic
0d70: 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61 6e  h tables to scan
0d80: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
0d90: 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  re,         /* t
0da0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
0db0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
0dc0: 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74 68  GroupBy,   /* th
0dd0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
0de0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  e */.  Expr *pHa
0df0: 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  ving,        /* 
0e00: 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
0e10: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
0e20: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
0e30: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
0e40: 75 73 65 20 2a 2f 0a 20 20 75 33 32 20 73 65 6c  use */.  u32 sel
0e50: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 2f  Flags,         /
0e60: 2a 20 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  * Flag parameter
0e70: 73 2c 20 73 75 63 68 20 61 73 20 53 46 5f 44 69  s, such as SF_Di
0e80: 73 74 69 6e 63 74 20 2a 2f 0a 20 20 45 78 70 72  stinct */.  Expr
0e90: 20 2a 70 4c 69 6d 69 74 2c 20 20 20 20 20 20 20   *pLimit,       
0ea0: 20 20 2f 2a 20 4c 49 4d 49 54 20 76 61 6c 75 65    /* LIMIT value
0eb0: 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e 6f  .  NULL means no
0ec0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 45 78 70 72  t used */.  Expr
0ed0: 20 2a 70 4f 66 66 73 65 74 20 20 20 20 20 20 20   *pOffset       
0ee0: 20 20 2f 2a 20 4f 46 46 53 45 54 20 76 61 6c 75    /* OFFSET valu
0ef0: 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  e.  NULL means n
0f00: 6f 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 20  o offset */.){. 
0f10: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
0f20: 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69 6e 3b   Select standin;
0f30: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0f40: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70  3DbMallocRawNN(p
0f50: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
0f60: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
0f70: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
0f80: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0f90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
0fa0: 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  d );.    pNew = 
0fb0: 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a 20 20  &standin;.  }.  
0fc0: 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 7b  if( pEList==0 ){
0fd0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 73 71  .    pEList = sq
0fe0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
0ff0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1000: 71 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73  qlite3Expr(pPars
1010: 65 2d 3e 64 62 2c 54 4b 5f 41 53 54 45 52 49 53  e->db,TK_ASTERIS
1020: 4b 2c 30 29 29 3b 0a 20 20 7d 0a 20 20 70 4e 65  K,0));.  }.  pNe
1030: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69  w->pEList = pELi
1040: 73 74 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  st;.  pNew->op =
1050: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e   TK_SELECT;.  pN
1060: 65 77 2d 3e 73 65 6c 46 6c 61 67 73 20 3d 20 73  ew->selFlags = s
1070: 65 6c 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  elFlags;.  pNew-
1080: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >iLimit = 0;.  p
1090: 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30  New->iOffset = 0
10a0: 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
10b0: 45 5f 45 4e 41 42 4c 45 44 0a 20 20 70 4e 65 77  E_ENABLED.  pNew
10c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20  ->zSelName[0] = 
10d0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4e 65 77  0;.#endif.  pNew
10e0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
10f0: 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  ] = -1;.  pNew->
1100: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
1110: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  = -1;.  pNew->nS
1120: 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
1130: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
1140: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
1150: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
1160: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 53 72  >db, sizeof(*pSr
1170: 63 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  c));.  pNew->pSr
1180: 63 20 3d 20 70 53 72 63 3b 0a 20 20 70 4e 65 77  c = pSrc;.  pNew
1190: 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72  ->pWhere = pWher
11a0: 65 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  e;.  pNew->pGrou
11b0: 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a  pBy = pGroupBy;.
11c0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
11d0: 3d 20 70 48 61 76 69 6e 67 3b 0a 20 20 70 4e 65  = pHaving;.  pNe
11e0: 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  w->pOrderBy = pO
11f0: 72 64 65 72 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  rderBy;.  pNew->
1200: 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1210: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ew->pNext = 0;. 
1220: 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1230: 70 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  pLimit;.  pNew->
1240: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1250: 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74 68  t;.  pNew->pWith
1260: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1270: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 4c  pOffset==0 || pL
1280: 69 6d 69 74 21 3d 30 20 7c 7c 20 70 50 61 72 73  imit!=0 || pPars
1290: 65 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 70 50 61  e->nErr>0 || pPa
12a0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
12b0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
12c0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
12d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20  llocFailed ) {. 
12e0: 20 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 70     clearSelect(p
12f0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65 77 2c  Parse->db, pNew,
1300: 20 70 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 29   pNew!=&standin)
1310: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1330: 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21  ert( pNew->pSrc!
1340: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
1350: 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73  rr>0 );.  }.  as
1360: 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61  sert( pNew!=&sta
1370: 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e  ndin );.  return
1380: 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69 66 20 53 45   pNew;.}..#if SE
1390: 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
13a0: 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  D./*.** Set the 
13b0: 6e 61 6d 65 20 6f 66 20 61 20 53 65 6c 65 63 74  name of a Select
13c0: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
13d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65 74  sqlite3SelectSet
13e0: 4e 61 6d 65 28 53 65 6c 65 63 74 20 2a 70 2c 20  Name(Select *p, 
13f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1400: 65 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 7a  e){.  if( p && z
1410: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Name ){.    sqli
1420: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1430: 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e 61 6d 65 29  eof(p->zSelName)
1440: 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22  , p->zSelName, "
1450: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  %s", zName);.  }
1460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
1470: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
1480: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
1490: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
14a0: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
14b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
14d0: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
14e0: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
14f0: 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c   clearSelect(db,
1500: 20 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   p, 1);.}../*.**
1510: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1520: 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  r to the right-m
1530: 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ost SELECT state
1540: 6d 65 6e 74 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ment in a compou
1550: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 65  nd..*/.static Se
1560: 6c 65 63 74 20 2a 66 69 6e 64 52 69 67 68 74 6d  lect *findRightm
1570: 6f 73 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  ost(Select *p){.
1580: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 4e 65 78    while( p->pNex
1590: 74 20 29 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74  t ) p = p->pNext
15a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
15b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 31 20 74  ./*.** Given 1 t
15c0: 6f 20 33 20 69 64 65 6e 74 69 66 69 65 72 73 20  o 3 identifiers 
15d0: 70 72 65 63 65 64 69 6e 67 20 74 68 65 20 4a 4f  preceding the JO
15e0: 49 4e 20 6b 65 79 77 6f 72 64 2c 20 64 65 74 65  IN keyword, dete
15f0: 72 6d 69 6e 65 20 74 68 65 0a 2a 2a 20 74 79 70  rmine the.** typ
1600: 65 20 6f 66 20 6a 6f 69 6e 2e 20 20 52 65 74 75  e of join.  Retu
1610: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  rn an integer co
1620: 6e 73 74 61 6e 74 20 74 68 61 74 20 65 78 70 72  nstant that expr
1630: 65 73 73 65 73 20 74 68 61 74 20 74 79 70 65 0a  esses that type.
1640: 2a 2a 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74  ** in terms of t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 69 74  he following bit
1660: 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
1670: 20 20 20 4a 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20     JT_INNER.**  
1680: 20 20 20 4a 54 5f 43 52 4f 53 53 0a 2a 2a 20 20     JT_CROSS.**  
1690: 20 20 20 4a 54 5f 4f 55 54 45 52 0a 2a 2a 20 20     JT_OUTER.**  
16a0: 20 20 20 4a 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a     JT_NATURAL.**
16b0: 20 20 20 20 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20       JT_LEFT.** 
16c0: 20 20 20 20 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a      JT_RIGHT.**.
16d0: 2a 2a 20 41 20 66 75 6c 6c 20 6f 75 74 65 72 20  ** A full outer 
16e0: 6a 6f 69 6e 20 69 73 20 74 68 65 20 63 6f 6d 62  join is the comb
16f0: 69 6e 61 74 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45  ination of JT_LE
1700: 46 54 20 61 6e 64 20 4a 54 5f 52 49 47 48 54 2e  FT and JT_RIGHT.
1710: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6c 6c  .**.** If an ill
1720: 65 67 61 6c 20 6f 72 20 75 6e 73 75 70 70 6f 72  egal or unsuppor
1730: 74 65 64 20 6a 6f 69 6e 20 74 79 70 65 20 69 73  ted join type is
1740: 20 73 65 65 6e 2c 20 74 68 65 6e 20 73 74 69 6c   seen, then stil
1750: 6c 20 72 65 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f  l return.** a jo
1760: 69 6e 20 74 79 70 65 2c 20 62 75 74 20 70 75 74  in type, but put
1770: 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65   an error in the
1780: 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1790: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17a0: 33 4a 6f 69 6e 54 79 70 65 28 50 61 72 73 65 20  3JoinType(Parse 
17b0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
17c0: 70 41 2c 20 54 6f 6b 65 6e 20 2a 70 42 2c 20 54  pA, Token *pB, T
17d0: 6f 6b 65 6e 20 2a 70 43 29 7b 0a 20 20 69 6e 74  oken *pC){.  int
17e0: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
17f0: 20 54 6f 6b 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d   Token *apAll[3]
1800: 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  ;.  Token *p;.  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1830: 30 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35  0123456789 12345
1840: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1850: 32 33 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  23 */.  static c
1860: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 54 65  onst char zKeyTe
1870: 78 74 5b 5d 20 3d 20 22 6e 61 74 75 72 61 6c 65  xt[] = "naturale
1880: 66 74 6f 75 74 65 72 69 67 68 74 66 75 6c 6c 69  ftouterightfulli
1890: 6e 6e 65 72 63 72 6f 73 73 22 3b 0a 20 20 73 74  nnercross";.  st
18a0: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
18b0: 74 20 7b 0a 20 20 20 20 75 38 20 69 3b 20 20 20  t {.    u8 i;   
18c0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e       /* Beginnin
18d0: 67 20 6f 66 20 6b 65 79 77 6f 72 64 20 74 65 78  g of keyword tex
18e0: 74 20 69 6e 20 7a 4b 65 79 54 65 78 74 5b 5d 20  t in zKeyText[] 
18f0: 2a 2f 0a 20 20 20 20 75 38 20 6e 43 68 61 72 3b  */.    u8 nChar;
1900: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
1910: 20 74 68 65 20 6b 65 79 77 6f 72 64 20 69 6e 20   the keyword in 
1920: 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20  characters */.  
1930: 20 20 75 38 20 63 6f 64 65 3b 20 20 20 20 20 2f    u8 code;     /
1940: 2a 20 4a 6f 69 6e 20 74 79 70 65 20 6d 61 73 6b  * Join type mask
1950: 20 2a 2f 0a 20 20 7d 20 61 4b 65 79 77 6f 72 64   */.  } aKeyword
1960: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 6e 61  [] = {.    /* na
1970: 74 75 72 61 6c 20 2a 2f 20 7b 20 30 2c 20 20 37  tural */ { 0,  7
1980: 2c 20 4a 54 5f 4e 41 54 55 52 41 4c 20 20 20 20  , JT_NATURAL    
1990: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
19a0: 20 20 20 2f 2a 20 6c 65 66 74 20 20 20 20 2a 2f     /* left    */
19b0: 20 7b 20 36 2c 20 20 34 2c 20 4a 54 5f 4c 45 46   { 6,  4, JT_LEF
19c0: 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  T|JT_OUTER      
19d0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75      },.    /* ou
19e0: 74 65 72 20 20 20 2a 2f 20 7b 20 31 30 2c 20 35  ter   */ { 10, 5
19f0: 2c 20 4a 54 5f 4f 55 54 45 52 20 20 20 20 20 20  , JT_OUTER      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
1a10: 20 20 20 2f 2a 20 72 69 67 68 74 20 20 20 2a 2f     /* right   */
1a20: 20 7b 20 31 34 2c 20 35 2c 20 4a 54 5f 52 49 47   { 14, 5, JT_RIG
1a30: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 20 20 20 20  HT|JT_OUTER     
1a40: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 66 75      },.    /* fu
1a50: 6c 6c 20 20 20 20 2a 2f 20 7b 20 31 39 2c 20 34  ll    */ { 19, 4
1a60: 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47  , JT_LEFT|JT_RIG
1a70: 48 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  HT|JT_OUTER },. 
1a80: 20 20 20 2f 2a 20 69 6e 6e 65 72 20 20 20 2a 2f     /* inner   */
1a90: 20 7b 20 32 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e   { 23, 5, JT_INN
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ER              
1ab0: 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 63 72      },.    /* cr
1ac0: 6f 73 73 20 20 20 2a 2f 20 7b 20 32 38 2c 20 35  oss   */ { 28, 5
1ad0: 2c 20 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52  , JT_INNER|JT_CR
1ae0: 4f 53 53 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  OSS         },. 
1af0: 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   };.  int i, j;.
1b00: 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b    apAll[0] = pA;
1b10: 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d 20 70 42  .  apAll[1] = pB
1b20: 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20 3d 20 70  ;.  apAll[2] = p
1b30: 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  C;.  for(i=0; i<
1b40: 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d 3b 20 69  3 && apAll[i]; i
1b50: 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 70 41  ++){.    p = apA
1b60: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 6a  ll[i];.    for(j
1b70: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
1b80: 61 4b 65 79 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b  aKeyword); j++){
1b90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d  .      if( p->n=
1ba0: 3d 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68  =aKeyword[j].nCh
1bb0: 61 72 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  ar .          &&
1bc0: 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
1bd0: 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a  ((char*)p->z, &z
1be0: 4b 65 79 54 65 78 74 5b 61 4b 65 79 77 6f 72 64  KeyText[aKeyword
1bf0: 5b 6a 5d 2e 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30  [j].i], p->n)==0
1c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e   ){.        join
1c10: 74 79 70 65 20 7c 3d 20 61 4b 65 79 77 6f 72 64  type |= aKeyword
1c20: 5b 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20  [j].code;.      
1c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c40: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
1c50: 61 73 65 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d  ase( j==0 || j==
1c60: 31 20 7c 7c 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d  1 || j==2 || j==
1c70: 33 20 7c 7c 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d  3 || j==4 || j==
1c80: 35 20 7c 7c 20 6a 3d 3d 36 20 29 3b 0a 20 20 20  5 || j==6 );.   
1c90: 20 69 66 28 20 6a 3e 3d 41 72 72 61 79 53 69 7a   if( j>=ArraySiz
1ca0: 65 28 61 4b 65 79 77 6f 72 64 29 20 29 7b 0a 20  e(aKeyword) ){. 
1cb0: 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d       jointype |=
1cc0: 20 4a 54 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20   JT_ERROR;.     
1cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ce0: 7d 0a 20 20 69 66 28 0a 20 20 20 20 20 28 6a 6f  }.  if(.     (jo
1cf0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 49 4e 4e  intype & (JT_INN
1d00: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 29 3d 3d 28  ER|JT_OUTER))==(
1d10: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1d20: 52 29 20 7c 7c 0a 20 20 20 20 20 28 6a 6f 69 6e  R) ||.     (join
1d30: 74 79 70 65 20 26 20 4a 54 5f 45 52 52 4f 52 29  type & JT_ERROR)
1d40: 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  !=0.  ){.    con
1d50: 73 74 20 63 68 61 72 20 2a 7a 53 70 20 3d 20 22  st char *zSp = "
1d60: 20 22 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ";.    assert( 
1d70: 70 42 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  pB!=0 );.    if(
1d80: 20 70 43 3d 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b   pC==0 ){ zSp++;
1d90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
1da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1db0: 75 6e 6b 6e 6f 77 6e 20 6f 72 20 75 6e 73 75 70  unknown or unsup
1dc0: 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79 70 65  ported join type
1dd0: 3a 20 22 0a 20 20 20 20 20 20 20 22 25 54 20 25  : ".       "%T %
1de0: 54 25 73 25 54 22 2c 20 70 41 2c 20 70 42 2c 20  T%s%T", pA, pB, 
1df0: 7a 53 70 2c 20 70 43 29 3b 0a 20 20 20 20 6a 6f  zSp, pC);.    jo
1e00: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
1e10: 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
1e20: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1e30: 54 45 52 29 21 3d 30 20 0a 20 20 20 20 20 20 20  TER)!=0 .       
1e40: 20 20 26 26 20 28 6a 6f 69 6e 74 79 70 65 20 26    && (jointype &
1e50: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 52 49 47   (JT_LEFT|JT_RIG
1e60: 48 54 29 29 21 3d 4a 54 5f 4c 45 46 54 20 29 7b  HT))!=JT_LEFT ){
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1e90: 20 20 20 20 22 52 49 47 48 54 20 61 6e 64 20 46      "RIGHT and F
1ea0: 55 4c 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20  ULL OUTER JOINs 
1eb0: 61 72 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  are not currentl
1ec0: 79 20 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20  y supported");. 
1ed0: 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54     jointype = JT
1ee0: 5f 49 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65  _INNER;.  }.  re
1ef0: 74 75 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d  turn jointype;.}
1f00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1f10: 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f  he index of a co
1f20: 6c 75 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e  lumn in a table.
1f30: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74    Return -1 if t
1f40: 68 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20  he column.** is 
1f50: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
1f60: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   the table..*/.s
1f70: 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e  tatic int column
1f80: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
1f90: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fa0: 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1fb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
1fc0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
1fd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fe0: 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b  ICmp(pTab->aCol[
1ff0: 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  i].zName, zCol)=
2000: 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
2010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
2020: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2030: 74 68 65 20 66 69 72 73 74 20 4e 20 74 61 62 6c  the first N tabl
2040: 65 73 20 69 6e 20 70 53 72 63 2c 20 66 72 6f 6d  es in pSrc, from
2050: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20   left to right, 
2060: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 0a 2a 2a  looking for a.**
2070: 20 74 61 62 6c 65 20 74 68 61 74 20 68 61 73 20   table that has 
2080: 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a  a column named z
2090: 43 6f 6c 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65  Col.  .**.** Whe
20a0: 6e 20 66 6f 75 6e 64 2c 20 73 65 74 20 2a 70 69  n found, set *pi
20b0: 54 61 62 20 61 6e 64 20 2a 70 69 43 6f 6c 20 74  Tab and *piCol t
20c0: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 64 65  o the table inde
20d0: 78 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 6e 64  x and column ind
20e0: 65 78 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 61 74  ex.** of the mat
20f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 61 6e 64  ching column and
2100: 20 72 65 74 75 72 6e 20 54 52 55 45 2e 0a 2a 2a   return TRUE..**
2110: 0a 2a 2a 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  .** If not found
2120: 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a  , return FALSE..
2130: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61  */.static int ta
2140: 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65  bleAndColumnInde
2150: 78 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  x(.  SrcList *pS
2160: 72 63 2c 20 20 20 20 20 20 20 2f 2a 20 41 72 72  rc,       /* Arr
2170: 61 79 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  ay of tables to 
2180: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
2190: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
21a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61   /* Number of ta
21b0: 62 6c 65 73 20 69 6e 20 70 53 72 63 2d 3e 61 5b  bles in pSrc->a[
21c0: 5d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  ] to search */. 
21d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
21e0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
21f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 65 20 61   the column we a
2200: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2210: 2f 0a 20 20 69 6e 74 20 2a 70 69 54 61 62 2c 20  /.  int *piTab, 
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2230: 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63 2d  e index of pSrc-
2240: 3e 61 5b 5d 20 68 65 72 65 20 2a 2f 0a 20 20 69  >a[] here */.  i
2250: 6e 74 20 2a 70 69 43 6f 6c 20 20 20 20 20 20 20  nt *piCol       
2260: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
2270: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 2a 70  ex of pSrc->a[*p
2280: 69 54 61 62 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c  iTab].pTab->aCol
2290: 5b 5d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  [] here */.){.  
22a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22b0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
22c0: 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20  ing over tables 
22d0: 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74  in pSrc */.  int
22e0: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
22f0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2300: 6c 75 6d 6e 20 6d 61 74 63 68 69 6e 67 20 7a 43  lumn matching zC
2310: 6f 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ol */..  assert(
2320: 20 28 70 69 54 61 62 3d 3d 30 29 3d 3d 28 70 69   (piTab==0)==(pi
2330: 43 6f 6c 3d 3d 30 29 20 29 3b 20 20 2f 2a 20 42  Col==0) );  /* B
2340: 6f 74 68 20 6f 72 20 6e 65 69 74 68 65 72 20 61  oth or neither a
2350: 72 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  re NULL */.  for
2360: 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b  (i=0; i<N; i++){
2370: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 63 6f 6c 75  .    iCol = colu
2380: 6d 6e 49 6e 64 65 78 28 70 53 72 63 2d 3e 61 5b  mnIndex(pSrc->a[
2390: 69 5d 2e 70 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  i].pTab, zCol);.
23a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
23b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 69 54  ){.      if( piT
23c0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ab ){.        *p
23d0: 69 54 61 62 20 3d 20 69 3b 0a 20 20 20 20 20 20  iTab = i;.      
23e0: 20 20 2a 70 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b    *piCol = iCol;
23f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2400: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
2420: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2430: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2440: 20 61 64 64 20 74 65 72 6d 73 20 69 6d 70 6c 69   add terms impli
2450: 65 64 20 62 79 20 4a 4f 49 4e 20 73 79 6e 74 61  ed by JOIN synta
2460: 78 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  x to the.** WHER
2470: 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73  E clause express
2480: 69 6f 6e 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ion of a SELECT 
2490: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 20 6e  statement. The n
24a0: 65 77 20 74 65 72 6d 2c 20 77 68 69 63 68 0a 2a  ew term, which.*
24b0: 2a 20 69 73 20 41 4e 44 65 64 20 77 69 74 68 20  * is ANDed with 
24c0: 74 68 65 20 65 78 69 73 74 69 6e 67 20 57 48 45  the existing WHE
24d0: 52 45 20 63 6c 61 75 73 65 2c 20 69 73 20 6f 66  RE clause, is of
24e0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
24f0: 20 20 20 20 28 74 61 62 31 2e 63 6f 6c 31 20 3d      (tab1.col1 =
2500: 20 74 61 62 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a   tab2.col2).**.*
2510: 2a 20 77 68 65 72 65 20 74 61 62 31 20 69 73 20  * where tab1 is 
2520: 74 68 65 20 69 53 72 63 27 74 68 20 74 61 62 6c  the iSrc'th tabl
2530: 65 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  e in SrcList pSr
2540: 63 20 61 6e 64 20 74 61 62 32 20 69 73 20 74 68  c and tab2 is th
2550: 65 20 0a 2a 2a 20 28 69 53 72 63 2b 31 29 27 74  e .** (iSrc+1)'t
2560: 68 2e 20 43 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69  h. Column col1 i
2570: 73 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66  s column iColLef
2580: 74 20 6f 66 20 74 61 62 31 2c 20 61 6e 64 20 63  t of tab1, and c
2590: 6f 6c 32 20 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e  ol2 is.** column
25a0: 20 69 43 6f 6c 52 69 67 68 74 20 6f 66 20 74 61   iColRight of ta
25b0: 62 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  b2..*/.static vo
25c0: 69 64 20 61 64 64 57 68 65 72 65 54 65 72 6d 28  id addWhereTerm(
25d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25f0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
2600: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
2610: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
2620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2630: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
2640: 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2650: 20 69 6e 74 20 69 4c 65 66 74 2c 20 20 20 20 20   int iLeft,     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
2680: 73 74 20 74 61 62 6c 65 20 74 6f 20 6a 6f 69 6e  st table to join
2690: 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e   in pSrc */.  in
26a0: 74 20 69 43 6f 6c 4c 65 66 74 2c 20 20 20 20 20  t iColLeft,     
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26c0: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
26d0: 20 69 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20   in first table 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67 68 74 2c  */.  int iRight,
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2710: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 69 6e   second table in
2720: 20 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69   pSrc */.  int i
2730: 43 6f 6c 52 69 67 68 74 2c 20 20 20 20 20 20 20  ColRight,       
2740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2750: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e  dex of column in
2760: 20 73 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f   second table */
2770: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
2780: 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
2790: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
27a0: 69 73 20 69 73 20 61 6e 20 4f 55 54 45 52 20 6a  is is an OUTER j
27b0: 6f 69 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  oin */.  Expr **
27c0: 70 70 57 68 65 72 65 20 20 20 20 20 20 20 20 20  ppWhere         
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
27e0: 55 54 3a 20 54 68 65 20 57 48 45 52 45 20 63 6c  UT: The WHERE cl
27f0: 61 75 73 65 20 74 6f 20 61 64 64 20 74 6f 20 2a  ause to add to *
2800: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2820: 0a 20 20 45 78 70 72 20 2a 70 45 31 3b 0a 20 20  .  Expr *pE1;.  
2830: 45 78 70 72 20 2a 70 45 32 3b 0a 20 20 45 78 70  Expr *pE2;.  Exp
2840: 72 20 2a 70 45 71 3b 0a 0a 20 20 61 73 73 65 72  r *pEq;..  asser
2850: 74 28 20 69 4c 65 66 74 3c 69 52 69 67 68 74 20  t( iLeft<iRight 
2860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
2870: 63 2d 3e 6e 53 72 63 3e 69 52 69 67 68 74 20 29  c->nSrc>iRight )
2880: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
2890: 2d 3e 61 5b 69 4c 65 66 74 5d 2e 70 54 61 62 20  ->a[iLeft].pTab 
28a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
28b0: 63 2d 3e 61 5b 69 52 69 67 68 74 5d 2e 70 54 61  c->a[iRight].pTa
28c0: 62 20 29 3b 0a 0a 20 20 70 45 31 20 3d 20 73 71  b );..  pE1 = sq
28d0: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
28e0: 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63 2c 20  nExpr(db, pSrc, 
28f0: 69 4c 65 66 74 2c 20 69 43 6f 6c 4c 65 66 74 29  iLeft, iColLeft)
2900: 3b 0a 20 20 70 45 32 20 3d 20 73 71 6c 69 74 65  ;.  pE2 = sqlite
2910: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2920: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 52 69 67  r(db, pSrc, iRig
2930: 68 74 2c 20 69 43 6f 6c 52 69 67 68 74 29 3b 0a  ht, iColRight);.
2940: 0a 20 20 70 45 71 20 3d 20 73 71 6c 69 74 65 33  .  pEq = sqlite3
2950: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2960: 5f 45 51 2c 20 70 45 31 2c 20 70 45 32 29 3b 0a  _EQ, pE1, pE2);.
2970: 20 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f    if( pEq && isO
2980: 75 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  uterJoin ){.    
2990: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
29a0: 70 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  pEq, EP_FromJoin
29b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
29c0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29d0: 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  pEq, EP_TokenOnl
29e0: 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  y|EP_Reduced) );
29f0: 0a 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50  .    ExprSetVVAP
2a00: 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f  roperty(pEq, EP_
2a10: 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70  NoReduce);.    p
2a20: 45 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  Eq->iRightJoinTa
2a30: 62 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e  ble = (i16)pE2->
2a40: 69 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70  iTable;.  }.  *p
2a50: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2a60: 45 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57  ExprAnd(db, *ppW
2a70: 68 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f  here, pEq);.}../
2a80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f  *.** Set the EP_
2a90: 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74  FromJoin propert
2aa0: 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  y on all terms o
2ab0: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
2ac0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73  ession..** And s
2ad0: 65 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67  et the Expr.iRig
2ae0: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69  htJoinTable to i
2af0: 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20  Table for every 
2b00: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65  term in the.** e
2b10: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
2b20: 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   The EP_FromJoin
2b30: 20 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65   property is use
2b40: 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e  d on terms of an
2b50: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74   expression to t
2b60: 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20  ell.** the LEFT 
2b70: 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65  OUTER JOIN proce
2b80: 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74  ssing logic that
2b90: 20 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61   this term is pa
2ba0: 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69  rt of the.** joi
2bb0: 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70  n restriction sp
2bc0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f  ecified in the O
2bd0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
2be0: 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74  e and not a part
2bf0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  .** of the more 
2c00: 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c  general WHERE cl
2c10: 61 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72  ause.  These ter
2c20: 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65  ms are moved ove
2c30: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52  r to the.** WHER
2c40: 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20  E clause during 
2c50: 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  join processing 
2c60: 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72  but we need to r
2c70: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65  emember that the
2c80: 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20  y.** originated 
2c90: 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49  in the ON or USI
2ca0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
2cb0: 20 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74   The Expr.iRight
2cc0: 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20  JoinTable tells 
2cd0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2ce0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2cf0: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2d00: 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61  on depends on ta
2d10: 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61  ble iRightJoinTa
2d20: 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74  ble even if that
2d30: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a   table is not.**
2d40: 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74   explicitly ment
2d50: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70  ioned in the exp
2d60: 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69  ression.  That i
2d70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65  nformation is ne
2d80: 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65  eded.** for case
2d90: 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
2da0: 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
2db0: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
2dc0: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62   t2 ON t1.a=t2.b
2dd0: 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a   AND t1.x=5.**.*
2de0: 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75  * The where clau
2df0: 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65  se needs to defe
2e00: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2e10: 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20  f the t1.x=5.** 
2e20: 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72  term until after
2e30: 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20   the t2 loop of 
2e40: 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68  the join.  In th
2e50: 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c  at way, a.** NUL
2e60: 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65  L t2 row will be
2e70: 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76   inserted whenev
2e80: 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20  er t1.x!=5.  If 
2e90: 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66  we do not.** def
2ea0: 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20  er the handling 
2eb0: 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69  of t1.x=5, it wi
2ec0: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  ll be processed 
2ed0: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61  immediately.** a
2ee0: 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70  fter the t1 loop
2ef0: 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74   and rows with t
2f00: 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65  1.x!=5 will neve
2f10: 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74  r appear in.** t
2f20: 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68  he output, which
2f30: 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a   is incorrect..*
2f40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2f50: 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a  tJoinExpr(Expr *
2f60: 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a  p, int iTable){.
2f70: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
2f80: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
2f90: 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  y(p, EP_FromJoin
2fa0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2fb0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2fc0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c  p, EP_TokenOnly|
2fd0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
2fe0: 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f     ExprSetVVAPro
2ff0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
3000: 64 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52  duce);.    p->iR
3010: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
3020: 28 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20  (i16)iTable;.   
3030: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46   if( p->op==TK_F
3040: 55 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e  UNCTION && p->x.
3050: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69  pList ){.      i
3060: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
3070: 69 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73  i=0; i<p->x.pLis
3080: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3090: 20 20 20 20 20 20 20 20 73 65 74 4a 6f 69 6e 45          setJoinE
30a0: 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  xpr(p->x.pList->
30b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62  a[i].pExpr, iTab
30c0: 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
30d0: 20 7d 0a 20 20 20 20 73 65 74 4a 6f 69 6e 45 78   }.    setJoinEx
30e0: 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61  pr(p->pLeft, iTa
30f0: 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  ble);.    p = p-
3100: 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a  >pRight;.  } .}.
3110: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3120: 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74 68  ine processes th
3130: 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69  e join informati
3140: 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20  on for a SELECT 
3150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e  statement..** ON
3160: 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
3170: 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  es are converted
3180: 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d   into extra term
3190: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
31a0: 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41  lause..** NATURA
31b0: 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65  L joins also cre
31c0: 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45 20  ate extra WHERE 
31d0: 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
31e0: 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66  .** The terms of
31f0: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61   a FROM clause a
3200: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
3210: 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20  the Select.pSrc 
3220: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68  structure..** Th
3230: 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c  e left most tabl
3240: 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20 65  e is the first e
3250: 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70  ntry in Select.p
3260: 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d  Src.  The right-
3270: 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73  most.** table is
3280: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e   the last entry.
3290: 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61    The join opera
32a0: 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74  tor is held in t
32b0: 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  he entry to.** t
32c0: 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65  he left.  Thus e
32d0: 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20  ntry 0 contains 
32e0: 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
32f0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62  r for the join b
3300: 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65  etween.** entrie
3310: 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20  s 0 and 1.  Any 
3320: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
3330: 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ses associated w
3340: 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65  ith the join are
3350: 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65  .** also attache
3360: 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e  d to the left en
3370: 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  try..**.** This 
3380: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
3390: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
33a0: 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rors encountered
33b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33c0: 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
33d0: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
33e0: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
33f0: 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  * All tables in 
3420: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
3430: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
3460: 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63  nters */.  struc
3470: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
3480: 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65  pLeft;     /* Le
3490: 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a  ft table being j
34a0: 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  oined */.  struc
34b0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
34c0: 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69  pRight;    /* Ri
34d0: 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  ght table being 
34e0: 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72  joined */..  pSr
34f0: 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  c = p->pSrc;.  p
3500: 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Left = &pSrc->a[
3510: 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26  0];.  pRight = &
3520: 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28  pLeft[1];.  for(
3530: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
3540: 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74  c-1; i++, pRight
3550: 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20  ++, pLeft++){.  
3560: 20 20 54 61 62 6c 65 20 2a 70 4c 65 66 74 54 61    Table *pLeftTa
3570: 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54 61 62 3b  b = pLeft->pTab;
3580: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3590: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
35a0: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
35b0: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
35c0: 4e 45 56 45 52 28 70 4c 65 66 74 54 61 62 3d 3d  NEVER(pLeftTab==
35d0: 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d  0 || pRightTab==
35e0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
35f0: 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52     isOuter = (pR
3600: 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  ight->fg.jointyp
3610: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
3620: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
3630: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
3640: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
3650: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
3660: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
3670: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
3680: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
3690: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
36a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
36b0: 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e   pRight->fg.join
36c0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
36d0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  L ){.      if( p
36e0: 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52  Right->pOn || pR
36f0: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
3700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3710: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3720: 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20  "a NATURAL join 
3730: 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20  may not have ". 
3740: 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e            "an ON
3750: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3760: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  ", 0);.        r
3770: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3780: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3790: 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f  j<pRightTab->nCo
37a0: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
37b0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
37c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d  /* Name of colum
37d0: 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 74  n in the right t
37e0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
37f0: 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f  int iLeft;     /
3800: 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20  * Matching left 
3810: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3820: 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20   int iLeftCol;  
3830: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75  /* Matching colu
3840: 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  mn in the left t
3850: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  able */..       
3860: 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54   zName = pRightT
3870: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
3880: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  e;.        if( t
3890: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
38a0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
38b0: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
38c0: 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  eftCol) ){.     
38d0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
38e0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
38f0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
3900: 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20   i+1, j,.       
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3930: 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ere);.        }.
3940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
3950: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
3960: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
3970: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
3980: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
3990: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
39a0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
39b0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
39c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
39d0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
39e0: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
39f0: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
3a00: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
3a10: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
3a20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3a30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
3a40: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
3a50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3a60: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
3a70: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
3a80: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
3a90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
3aa0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
3ab0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
3ac0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
3ad0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
3ae0: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
3af0: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
3b00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
3b10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3b20: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
3b30: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
3b40: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
3b50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3b60: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
3b70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3b80: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
3b90: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
3ba0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
3bb0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
3bc0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3bd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
3be0: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
3bf0: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
3c00: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
3c10: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
3c20: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
3c30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3c40: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
3c50: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
3c60: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
3c70: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
3c80: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
3c90: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
3ca0: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
3cb0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
3cc0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
3cd0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
3ce0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3cf0: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3d00: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
3d10: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
3d20: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
3d30: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
3d40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3d50: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
3d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3d70: 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e  term in the USIN
3d80: 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  G clause */.    
3d90: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20      int iLeft;  
3da0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e       /* Table on
3db0: 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d   the left with m
3dc0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
3dd0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ame */.        i
3de0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20  nt iLeftCol;    
3df0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
3e00: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
3e10: 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  umn on the left 
3e20: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
3e30: 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43  RightCol;   /* C
3e40: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20  olumn number of 
3e50: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
3e60: 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
3e70: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
3e80: 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61   pList->a[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67  me;.        iRig
3ea0: 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e  htCol = columnIn
3eb0: 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a  dex(pRightTab, z
3ec0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
3ed0: 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20  f( iRightCol<0. 
3ee0: 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c          || !tabl
3ef0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
3f00: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
3f10: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
3f20: 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  Col).        ){.
3f30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3f40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3f50: 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75  , "cannot join u
3f60: 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d  sing column %s -
3f70: 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20   column ".      
3f80: 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65        "not prese
3f90: 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65  nt in both table
3fa0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
3fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3fc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3fd0: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
3fe0: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
3ff0: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
4000: 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20  1, iRightCol,.  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4030: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d  pWhere);.      }
4040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4050: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
4060: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
4070: 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f  /.static KeyInfo
4080: 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70   *keyInfoFromExp
4090: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
40a0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
40b0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
40c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
40d0: 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f  pList,     /* Fo
40e0: 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  rm the KeyInfo o
40f0: 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20  bject from this 
4100: 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  ExprList */.  in
4110: 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20  t iStart,       
4120: 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68     /* Begin with
4130: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20   this column of 
4140: 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  pList */.  int n
4150: 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20  Extra           
4160: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
4170: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74   extra columns t
4180: 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a  o the end */.);.
4190: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
41a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70  code that will p
41b0: 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69  ush the record i
41c0: 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44  n registers regD
41d0: 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72  ata.** through r
41e0: 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f  egData+nData-1 o
41f0: 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a  nto the sorter..
4200: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4210: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20  ushOntoSorter(. 
4220: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4230: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
4240: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
4250: 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20  ortCtx *pSort,  
4260: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4270: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f  tion about the O
4280: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
4290: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
42a0: 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  ect,       /* Th
42b0: 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73  e whole SELECT s
42c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
42d0: 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20  t regData,      
42e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65       /* First re
42f0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
4300: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
4310: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69   */.  int regOri
4320: 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20  gData,       /* 
4330: 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68  First register h
4340: 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f  olding data befo
4350: 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20  re packing */.  
4360: 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20  int nData,      
4370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4380: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
4390: 74 68 65 20 64 61 74 61 20 61 72 72 61 79 20 2a  the data array *
43a0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
43b0: 65 67 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  eg         /* No
43c0: 2e 20 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74  . of reg prior t
43d0: 6f 20 72 65 67 44 61 74 61 20 61 76 61 69 6c 61  o regData availa
43e0: 62 6c 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29  ble for use */.)
43f0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
4400: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
4410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4420: 20 20 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64       /* Stmt und
4430: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4440: 2a 2f 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20  */.  int bSeq = 
4450: 28 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ((pSort->sortFla
4460: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
4470: 65 53 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20  eSorter)==0);.  
4480: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72  int nExpr = pSor
4490: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
44a0: 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pr;             
44b0: 20 2f 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52   /* No. of ORDER
44c0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69   BY terms */.  i
44d0: 6e 74 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72  nt nBase = nExpr
44e0: 20 2b 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b   + bSeq + nData;
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 2f 2a 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72  /* Fields in sor
4510: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4520: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 2f 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72   /* Regs for sor
4560: 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ter record */.  
4570: 69 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20  int regRecord = 
4580: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 2f 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f   /* Assembled so
45b0: 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20  rter record */. 
45c0: 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53   int nOBSat = pS
45d0: 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20  ort->nOBSat;    
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65    /* ORDER BY te
4600: 72 6d 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  rms to skip */. 
4610: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f      /* Opcode to
4640: 20 61 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f   add sorter reco
4650: 72 64 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a  rd to sorter */.
4660: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20    int iLimit;   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f       /* LIMIT co
4690: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
46a0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
46b0: 53 65 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Seq==1 );.  asse
46c0: 72 74 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20  rt( nData==1 || 
46d0: 72 65 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67  regData==regOrig
46e0: 44 61 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44  Data || regOrigD
46f0: 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
4700: 6e 50 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20  nPrefixReg ){.  
4710: 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 66 69    assert( nPrefi
4720: 78 52 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71  xReg==nExpr+bSeq
4730: 20 29 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20   );.    regBase 
4740: 3d 20 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70  = regData - nExp
4750: 72 20 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73  r - bSeq;.  }els
4760: 65 7b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d  e{.    regBase =
4770: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20   pParse->nMem + 
4780: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
4790: 4d 65 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20  Mem += nBase;.  
47a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c  }.  assert( pSel
47b0: 65 63 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20  ect->iOffset==0 
47c0: 7c 7c 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d  || pSelect->iLim
47d0: 69 74 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69  it!=0 );.  iLimi
47e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66  t = pSelect->iOf
47f0: 66 73 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e  fset ? pSelect->
4800: 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c  iOffset+1 : pSel
4810: 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70  ect->iLimit;.  p
4820: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20  Sort->labelDone 
4830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
4840: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c  eLabel(v);.  sql
4850: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4860: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f  List(pParse, pSo
4870: 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65  rt->pOrderBy, re
4880: 67 42 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61  gBase, regOrigDa
4890: 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ta,.            
48a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
48b0: 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20  LITE_ECEL_DUP | 
48c0: 28 72 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51  (regOrigData? SQ
48d0: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20  LITE_ECEL_REF : 
48e0: 30 29 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20  0));.  if( bSeq 
48f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
4900: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
4910: 65 71 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e  equence, pSort->
4920: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73  iECursor, regBas
4930: 65 2b 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  e+nExpr);.  }.  
4940: 69 66 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d  if( nPrefixReg==
4950: 30 20 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a  0 && nData>0 ){.
4960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4970: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
4980: 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65  regData, regBase
4990: 2b 6e 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61  +nExpr+bSeq, nDa
49a0: 74 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ta);.  }.  sqlit
49b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
49c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
49d0: 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e  egBase+nOBSat, n
49e0: 42 61 73 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67  Base-nOBSat, reg
49f0: 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 6e  Record);.  if( n
4a00: 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69  OBSat>0 ){.    i
4a10: 6e 74 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20  nt regPrevKey;  
4a20: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f   /* The first nO
4a30: 42 53 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  BSat columns of 
4a40: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
4a50: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
4a60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64  First;    /* Add
4a70: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49  ress of the OP_I
4a80: 66 4e 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  fNot opcode */. 
4a90: 20 20 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20     int addrJmp; 
4aa0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
4ab0: 6f 66 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f  of the OP_Jump o
4ac0: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62  pcode */.    Vdb
4ad0: 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f  eOp *pOp;      /
4ae0: 2a 20 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70  * Opcode that op
4af0: 65 6e 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a  ens the sorter *
4b00: 2f 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20  /.    int nKey; 
4b10: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b20: 72 20 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79  r of sorting key
4b30: 20 63 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64   columns, includ
4b40: 69 6e 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  ing OP_Sequence 
4b50: 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  */.    KeyInfo *
4b60: 70 4b 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  pKI;     /* Orig
4b70: 69 6e 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20  inal KeyInfo on 
4b80: 74 68 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65  the sorter table
4b90: 20 2a 2f 0a 0a 20 20 20 20 72 65 67 50 72 65 76   */..    regPrev
4ba0: 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Key = pParse->nM
4bb0: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4bc0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d  ->nMem += pSort-
4bd0: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65  >nOBSat;.    nKe
4be0: 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72  y = nExpr - pSor
4bf0: 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71  t->nOBSat + bSeq
4c00: 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29  ;.    if( bSeq )
4c10: 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73  {.      addrFirs
4c20: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
4c30: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
4c40: 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  t, regBase+nExpr
4c50: 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ); .    }else{. 
4c60: 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d       addrFirst =
4c70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4c80: 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p1(v, OP_Sequenc
4c90: 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45  eTest, pSort->iE
4ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  Cursor);.    }. 
4cb0: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
4cc0: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
4cd0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4ce0: 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76  Compare, regPrev
4cf0: 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53  Key, regBase, pS
4d00: 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20  ort->nOBSat);.  
4d10: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
4d20: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
4d30: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
4d40: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
4d50: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
4d60: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
4d70: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79    pOp->p2 = nKey
4d80: 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b   + nData;.    pK
4d90: 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  I = pOp->p4.pKey
4da0: 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Info;.    memset
4db0: 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72  (pKI->aSortOrder
4dc0: 2c 20 30 2c 20 70 4b 49 2d 3e 6e 46 69 65 6c 64  , 0, pKI->nField
4dd0: 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50 5f 4a  ); /* Makes OP_J
4de0: 75 6d 70 20 62 65 6c 6f 77 20 74 65 73 74 61 62  ump below testab
4df0: 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  le */.    sqlite
4e00: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
4e10: 20 2d 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c   -1, (char*)pKI,
4e20: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
4e30: 20 20 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d    testcase( pKI-
4e40: 3e 6e 58 46 69 65 6c 64 3e 32 20 29 3b 0a 20 20  >nXField>2 );.  
4e50: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
4e60: 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
4e70: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
4e80: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
4e90: 2c 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20  , nOBSat,.      
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 70 4b 49 2d 3e 6e 58 46 69 65 6c       pKI->nXFiel
4ed0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
4ee0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
4ef0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
4f00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4f10: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
4f20: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
4f30: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
4f40: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
4f50: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
4f60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
4f70: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
4f80: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
4f90: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
4fa0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
4fb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
4fc0: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
4fd0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
4fe0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
4ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5000: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
5010: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
5020: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5030: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5050: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5060: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5070: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5080: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5090: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
50a0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
50b0: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
50c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50d0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
50e0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
50f0: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
5100: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5110: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
5120: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5130: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
5140: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
5150: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 6f  eSorter ){.    o
5160: 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  p = OP_SorterIns
5170: 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ert;.  }else{.  
5180: 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e 73    op = OP_IdxIns
5190: 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ert;.  }.  sqlit
51a0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
51b0: 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e 69 45  v, op, pSort->iE
51c0: 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f 72  Cursor, regRecor
51d0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
51e0: 20 20 20 20 20 20 20 20 20 20 72 65 67 42 61 73            regBas
51f0: 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d  e+nOBSat, nBase-
5200: 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28 20 69  nOBSat);.  if( i
5210: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 69 6e 74  Limit ){.    int
5220: 20 61 64 64 72 3b 0a 20 20 20 20 69 6e 74 20 72   addr;.    int r
5230: 31 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 46 69  1 = 0;.    /* Fi
5240: 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 20 75 6e  ll the sorter un
5250: 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  til it contains 
5260: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 65 6e 74  LIMIT+OFFSET ent
5270: 72 69 65 73 2e 20 20 28 54 68 65 20 69 4c 69 6d  ries.  (The iLim
5280: 69 74 0a 20 20 20 20 2a 2a 20 72 65 67 69 73 74  it.    ** regist
5290: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
52a0: 64 20 77 69 74 68 20 76 61 6c 75 65 20 6f 66 20  d with value of 
52b0: 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 29 20 20  LIMIT+OFFSET.)  
52c0: 41 66 74 65 72 20 74 68 65 20 73 6f 72 74 65 72  After the sorter
52d0: 0a 20 20 20 20 2a 2a 20 66 69 6c 6c 73 20 75 70  .    ** fills up
52e0: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 65 61  , delete the lea
52f0: 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
5300: 73 6f 72 74 65 72 20 61 66 74 65 72 20 65 61 63  sorter after eac
5310: 68 20 69 6e 73 65 72 74 2e 0a 20 20 20 20 2a 2a  h insert..    **
5320: 20 54 68 75 73 20 77 65 20 6e 65 76 65 72 20 68   Thus we never h
5330: 6f 6c 64 20 6d 6f 72 65 20 74 68 61 6e 20 74 68  old more than th
5340: 65 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20 72  e LIMIT+OFFSET r
5350: 6f 77 73 20 69 6e 20 6d 65 6d 6f 72 79 20 61 74  ows in memory at
5360: 20 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 61 64 64   once */.    add
5370: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
5380: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f  ddOp1(v, OP_IfNo
5390: 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 20  tZero, iLimit); 
53a0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
53b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
53c0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73  AddOp1(v, OP_Las
53d0: 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73  t, pSort->iECurs
53e0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 70 53 6f  or);.    if( pSo
53f0: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
5400: 72 4c 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 72  rLoop ){.      r
5410: 31 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  1 = ++pParse->nM
5420: 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
5430: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5440: 50 5f 43 6f 6c 75 6d 6e 2c 20 70 53 6f 72 74 2d  P_Column, pSort-
5450: 3e 69 45 43 75 72 73 6f 72 2c 20 6e 45 78 70 72  >iECursor, nExpr
5460: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
5470: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
5480: 71 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  q"));.    }.    
5490: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
54a0: 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20  1(v, OP_Delete, 
54b0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 29  pSort->iECursor)
54c0: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
54d0: 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f  >bOrderedInnerLo
54e0: 6f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  op ){.      /* I
54f0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
5500: 20 69 73 20 64 72 69 76 65 6e 20 62 79 20 61 6e   is driven by an
5510: 20 69 6e 64 65 78 20 73 75 63 68 20 74 68 61 74   index such that
5520: 20 76 61 6c 75 65 73 20 66 72 6f 6d 0a 20 20 20   values from.   
5530: 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69     ** the same i
5540: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
5550: 69 6e 6e 65 72 20 6c 6f 6f 70 20 61 72 65 20 69  inner loop are i
5560: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5570: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6d  then.      ** im
5580: 6d 65 64 69 61 74 65 6c 79 20 6a 75 6d 70 20 74  mediately jump t
5590: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
55a0: 74 69 6f 6e 20 6f 66 20 61 6e 20 69 6e 6e 65 72  tion of an inner
55b0: 20 6c 6f 6f 70 20 69 66 20 74 68 65 0a 20 20 20   loop if the.   
55c0: 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 72 6f 6d     ** entry from
55d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 74 65   the current ite
55e0: 72 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  ration does not 
55f0: 66 69 74 20 69 6e 74 6f 20 74 68 65 20 74 6f 70  fit into the top
5600: 0a 20 20 20 20 20 20 2a 2a 20 4c 49 4d 49 54 2b  .      ** LIMIT+
5610: 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 6f  OFFSET entries o
5620: 66 20 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f  f the sorter. */
5630: 0a 20 20 20 20 20 20 69 6e 74 20 69 42 72 6b 20  .      int iBrk 
5640: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
5650: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
5660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
5670: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5680: 71 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  q, regBase+nExpr
5690: 2c 20 69 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20  , iBrk, r1);.   
56a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
56b0: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
56c0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
56d0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
56e0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
56f0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5700: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
5710: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
5720: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
5730: 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63  OFFSET.*/.static
5740: 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74   void codeOffset
5750: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
5760: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
5770: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
5780: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66   VM */.  int iOf
5790: 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65  fset,      /* Re
57a0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74  gister holding t
57b0: 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65  he offset counte
57c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  r */.  int iCont
57d0: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
57e0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
57f0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
5800: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66   */.){.  if( iOf
5810: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71  fset>0 ){.    sq
5820: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5830: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66  v, OP_IfPos, iOf
5840: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  fset, iContinue,
5850: 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   1); VdbeCoverag
5860: 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  e(v);.    VdbeCo
5870: 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45  mment((v, "OFFSE
5880: 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  T"));.  }.}../*.
5890: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
58a0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
58b0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
58c0: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
58d0: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
58e0: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
58f0: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
5900: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
5910: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
5920: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
5930: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
5940: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
5950: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
5960: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
5970: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
5980: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
5990: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
59a0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
59b0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
59c0: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
59d0: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
59e0: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
59f0: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
5a00: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
5a10: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
5a20: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5a30: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
5a40: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
5a50: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
5a60: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
5a70: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
5a80: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
5a90: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
5aa0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
5ab0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
5ac0: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
5ad0: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
5ae0: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
5af0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5b00: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
5b10: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
5b20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
5b30: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
5b40: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
5b50: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
5b60: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
5b70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5b80: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
5b90: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5ba0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
5bb0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
5bc0: 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76  Mem, N); VdbeCov
5bd0: 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
5be0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
5bf0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
5c00: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
5c10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c20: 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e  4Int(v, OP_IdxIn
5c30: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20  sert, iTab, r1, 
5c40: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
5c50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5c60: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
5c70: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69  KRESULT);.  sqli
5c80: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
5c90: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
5ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5cb0: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
5cc0: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
5cd0: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
5ce0: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
5cf0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
5d00: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
5d10: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
5d20: 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f 6e  EList expression
5d30: 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61 74  s.** are evaluat
5d40: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ed in order to g
5d50: 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  et the data for 
5d60: 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73 72  this row.  If sr
5d70: 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f 20  cTab is.** zero 
5d80: 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64 61  or more, then da
5d90: 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  ta is pulled fro
5da0: 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45 4c  m srcTab and pEL
5db0: 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ist is used only
5dc0: 20 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20   .** to get the 
5dd0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
5de0: 73 20 61 6e 64 20 74 68 65 20 63 6f 6c 6c 61 74  s and the collat
5df0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ion sequence for
5e00: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
5e10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
5e20: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
5e30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
5e50: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
5e60: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
5e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5e80: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
5e90: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
5ea0: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
5eb0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
5ec0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
5ed0: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
5ee0: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
5ef0: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
5f00: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
5f10: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
5f20: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
5f30: 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  Sort,         /*
5f40: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
5f50: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
5f60: 63 65 73 73 20 4f 52 44 45 52 20 42 59 20 2a 2f  cess ORDER BY */
5f70: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
5f80: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
5f90: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
5fa0: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
5fb0: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
5fc0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
5fd0: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
5fe0: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
5ff0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
6000: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
6010: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
6020: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
6030: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
6040: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
6050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
6060: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
6070: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
6080: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
6090: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
60a0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
60b0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
60c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
60d0: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
60e0: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
60f0: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
6100: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
6110: 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77  >eDest;   /* How
6120: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72   to dispose of r
6130: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
6140: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6150: 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74  SDParm; /* First
6160: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73   argument to dis
6170: 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a  posal method */.
6180: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c    int nResultCol
6190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
61a0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   Number of resul
61b0: 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69  t columns */.  i
61c0: 6e 74 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20  nt nPrefixReg = 
61d0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  0;         /* Nu
61e0: 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65  mber of extra re
61f0: 67 69 73 74 65 72 73 20 62 65 66 6f 72 65 20 72  gisters before r
6200: 65 67 52 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 2f  egResult */..  /
6210: 2a 20 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65  * Usually, regRe
6220: 73 75 6c 74 20 69 73 20 74 68 65 20 66 69 72 73  sult is the firs
6230: 74 20 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72  t cell in an arr
6240: 61 79 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  ay of memory cel
6250: 6c 73 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  ls.  ** containi
6260: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  ng the current r
6270: 65 73 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68  esult row. In th
6280: 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67 20  is case regOrig 
6290: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20  is set to the.  
62a0: 2a 2a 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48  ** same value. H
62b0: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 72  owever, if the r
62c0: 65 73 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67  esults are being
62d0: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72   sent to the sor
62e0: 74 65 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61  ter, the.  ** va
62f0: 6c 75 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70  lues for any exp
6300: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
6310: 65 20 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74  e also part of t
6320: 68 65 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20  he sort-key are 
6330: 6f 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f  omitted.  ** fro
6340: 6d 20 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e  m this array. In
6350: 20 74 68 69 73 20 63 61 73 65 20 72 65 67 4f 72   this case regOr
6360: 69 67 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ig is set to zer
6370: 6f 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  o.  */.  int reg
6380: 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
6390: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
63a0: 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20   memory holding 
63b0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20  current results 
63c0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
63d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
63e0: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d   /* Start of mem
63f0: 6f 72 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c  ory holding full
6400: 20 72 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a   result (or 0) *
6410: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
6420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
6430: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
6440: 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
6450: 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e  ct ? pDistinct->
6460: 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52  eTnctType : WHER
6470: 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
6480: 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20  .  if( pSort && 
6490: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d  pSort->pOrderBy=
64a0: 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a  =0 ) pSort = 0;.
64b0: 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26    if( pSort==0 &
64c0: 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20 29  & !hasDistinct )
64d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43  {.    assert( iC
64e0: 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20  ontinue!=0 );.  
64f0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
6500: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
6510: 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tinue);.  }..  /
6520: 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75 65  * Pull the reque
6530: 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20  sted columns..  
6540: 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  */.  nResultCol 
6550: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
6560: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
6570: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
6580: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
6590: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
65a0: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
65b0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
65c0: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
65d0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
65e0: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
65f0: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
6600: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
6610: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
6620: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
6630: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
6640: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
6650: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
6660: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
6670: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
6680: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
6690: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
66a0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
66b0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
66c0: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
66d0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
66e0: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
66f0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
6700: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
6710: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
6720: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
6730: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
6740: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
6750: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
6760: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
6770: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
6780: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
6790: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
67a0: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
67b0: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
67c0: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
67d0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
67e0: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
67f0: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
6800: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
6810: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
6820: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
6830: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
6840: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
6850: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
6860: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
6870: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
6880: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
6890: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
68a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
68b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
68c0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
68d0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
68e0: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
68f0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
6900: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
6910: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
6920: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6930: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
6940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65      /* If the de
6950: 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20  stination is an 
6960: 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72  EXISTS(...) expr
6970: 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75  ession, the actu
6980: 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73  al.    ** values
6990: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
69a0: 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20   SELECT are not 
69b0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
69c0: 0a 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67  .    u8 ecelFlag
69d0: 73 3b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  s;.    if( eDest
69e0: 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65  ==SRT_Mem || eDe
69f0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
6a00: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
6a10: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6a20: 65 63 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49  ecelFlags = SQLI
6a30: 54 45 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20  TE_ECEL_DUP;.   
6a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63   }else{.      ec
6a50: 65 6c 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20  elFlags = 0;.   
6a60: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
6a70: 20 26 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d   && hasDistinct=
6a80: 3d 30 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  =0 && eDest!=SRT
6a90: 5f 45 70 68 65 6d 54 61 62 20 26 26 20 65 44 65  _EphemTab && eDe
6aa0: 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b  st!=SRT_Table ){
6ab0: 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
6ac0: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
6ad0: 20 70 45 4c 69 73 74 20 74 68 61 74 20 69 73 20   pEList that is 
6ae0: 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70  a copy of an exp
6af0: 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20  ression in.     
6b00: 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   ** the ORDER BY
6b10: 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d 3e   clause (pSort->
6b20: 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20 74  pOrderBy), set t
6b30: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20  he associated . 
6b40: 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79       ** iOrderBy
6b50: 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65  Col value to one
6b60: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 69   more than the i
6b70: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44 45  ndex of the ORDE
6b80: 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20 65  R BY .      ** e
6b90: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e  xpression within
6ba0: 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74 68   the sort-key th
6bb0: 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65  at pushOntoSorte
6bc0: 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  r() will generat
6bd0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  e..      ** This
6be0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 45 4c 69   allows the pELi
6bf0: 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f  st field to be o
6c00: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
6c10: 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20  sorted record,. 
6c20: 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73       ** saving s
6c30: 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63  pace and CPU cyc
6c40: 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65  les.  */.      e
6c50: 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c  celFlags |= (SQL
6c60: 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46  ITE_ECEL_OMITREF
6c70: 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46  |SQLITE_ECEL_REF
6c80: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  );.      for(i=p
6c90: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c  Sort->nOBSat; i<
6ca0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
6cb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
6cc0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
6cd0: 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53       if( (j = pS
6ce0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ort->pOrderBy->a
6cf0: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
6d00: 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
6d10: 20 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 2d      pEList->a[j-
6d20: 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  1].u.x.iOrderByC
6d30: 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d 3e  ol = i+1-pSort->
6d40: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20 20  nOBSat;.        
6d50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6d60: 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20  regOrig = 0;.   
6d70: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
6d80: 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65  ==SRT_Set || eDe
6d90: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20  st==SRT_Mem .   
6da0: 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74          || eDest
6db0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6dc0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  || eDest==SRT_Ou
6dd0: 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20  tput );.    }.  
6de0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 73    nResultCol = s
6df0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
6e00: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 70 45  prList(pParse,pE
6e10: 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c 30  List,regResult,0
6e20: 2c 65 63 65 6c 46 6c 61 67 73 29 3b 0a 20 20 7d  ,ecelFlags);.  }
6e30: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49  ..  /* If the DI
6e40: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77  STINCT keyword w
6e50: 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68  as present on th
6e60: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6e70: 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73  nt.  ** and this
6e80: 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65   row has been se
6e90: 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20  en before, then 
6ea0: 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73  do not make this
6eb0: 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f   row.  ** part o
6ec0: 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  f the result..  
6ed0: 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74  */.  if( hasDist
6ee0: 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74  inct ){.    swit
6ef0: 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  ch( pDistinct->e
6f00: 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20  TnctType ){.    
6f10: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
6f20: 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b  TINCT_ORDERED: {
6f30: 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20  .        VdbeOp 
6f40: 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  *pOp;           
6f50: 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65   /* No longer re
6f60: 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d  quired OpenEphem
6f70: 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20  eral instr. */. 
6f80: 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70         int iJump
6f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6fa0: 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  * Jump destinati
6fb0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  on */.        in
6fc0: 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20  t regPrev;      
6fd0: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
6fe0: 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f  s row content */
6ff0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ..        /* All
7000: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7010: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77  the previous row
7020: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50   */.        regP
7030: 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
7040: 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50  em+1;.        pP
7050: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
7060: 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20  esultCol;..     
7070: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
7080: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
7090: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
70a0: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
70b0: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
70c0: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
70d0: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
70e0: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
70f0: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
7100: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
7110: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
7120: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
7130: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
7140: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
7150: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
7160: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
7170: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
7180: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
7190: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
71a0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
71b0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
71c0: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
71d0: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
71e0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
71f0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
7200: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
7210: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
7220: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
7230: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
7240: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
7250: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
7260: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
7270: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
7280: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
7290: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20  ResultCol;.     
72a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
72b0: 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  esultCol; i++){.
72c0: 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65            CollSe
72d0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
72e0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
72f0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  arse, pEList->a[
7300: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
7310: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
7320: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
7330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7340: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
7350: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
7360: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
7370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
7380: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
7390: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
73a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
73b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
73c0: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
73d0: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
73e0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
73f0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
7400: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
7410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7420: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7430: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
7440: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
7450: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
7460: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
7470: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
7480: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
7490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
74c0: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
74d0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
74e0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
74f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7500: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
7510: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
7520: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
7530: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7540: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
7550: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
7560: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
7570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7580: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
7590: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
75a0: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
75b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
75c0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
75d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
75e0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
75f0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
7600: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
7610: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
7620: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
7630: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
7640: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
7650: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
7670: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
7680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7690: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
76a0: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
76b0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
76c0: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
76d0: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
76e0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
76f0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
7700: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
7710: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
7720: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
7730: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
7740: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
7750: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
7760: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
7770: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
7780: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
7790: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
77a0: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
77b0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
77c0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
77d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
77e0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
77f0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
7800: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
7810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7820: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
7830: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
7840: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
7850: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
7860: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7870: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
7880: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
7890: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
78a0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
78b0: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
78c0: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
78d0: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
78e0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
78f0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
7900: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
7910: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
7920: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
7930: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
7940: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
7950: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
7960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7970: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
7980: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
7990: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
79a0: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
79b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
79c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
79d0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
79e0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
79f0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
7a00: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
7a10: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
7a20: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
7a30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
7a40: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
7a50: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
7a60: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
7a70: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
7a80: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
7a90: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
7aa0: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
7ab0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
7ac0: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
7ad0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
7ae0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
7af0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
7b00: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
7b10: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
7b20: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
7b30: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
7b40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
7b50: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7b60: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
7b70: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
7b80: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
7b90: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
7ba0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
7bb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7bc0: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
7bd0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
7be0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
7bf0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
7c00: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
7c10: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
7c20: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
7c30: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
7c40: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
7c50: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
7c60: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
7c70: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
7c80: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
7c90: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
7ca0: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
7cb0: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
7cc0: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
7cd0: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
7ce0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
7cf0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
7d00: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
7d10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
7d20: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
7d30: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
7d40: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
7d50: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7d60: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7d70: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
7d80: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
7d90: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7da0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7db0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
7dc0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7dd0: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
7de0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
7df0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7e00: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
7e10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7e20: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
7e30: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
7e40: 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72  ter(pParse, pSor
7e50: 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78  t, p, r1+nPrefix
7e60: 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c 31 2c  Reg,regResult,1,
7e70: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
7e80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7e90: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
7ea0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
7eb0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
7ec0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7ed0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7ee0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
7ef0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7f00: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
7f10: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
7f20: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
7f30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7f40: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7f50: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7f60: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
7f70: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
7f80: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
7f90: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
7fa0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
7fb0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
7fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7fd0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7fe0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
7ff0: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
8000: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
8010: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
8020: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
8030: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
8040: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
8050: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
8060: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
8070: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
8080: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
8090: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
80a0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
80b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
80c0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
80d0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
80e0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
80f0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
8100: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
8110: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
8120: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
8130: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
8140: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
8150: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
8160: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
8170: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
8180: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
8190: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
81a0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
81b0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
81c0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
81d0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
81e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
81f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
8200: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
8210: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
8220: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
8230: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
8240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8250: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
8260: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
8270: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
8280: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
8290: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
82a0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
82b0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
82c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
82d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
82e0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
82f0: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
8300: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
8310: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
8320: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
8330: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8340: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8350: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
8360: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8380: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8390: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
83a0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
83b0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
83c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
83d0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
83e0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
83f0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8400: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8410: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
8420: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
8430: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
8440: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
8450: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
8460: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
8470: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8480: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
8490: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
84a0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
84b0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
84c0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
84d0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
84e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
84f0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8500: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
8510: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
8520: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
8530: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
8540: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
8550: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
8560: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
8570: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
8580: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
8590: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
85a0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
85b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
85c0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
85d0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
85e0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
85f0: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
8600: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
8610: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
8620: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
8630: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
8640: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
8650: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
8660: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
8670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8680: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
8690: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
86a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
86b0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
86c0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
86d0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
86e0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
86f0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
8700: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
8710: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8720: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
8730: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8740: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
8750: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
8760: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
8770: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
8780: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
8790: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
87a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
87b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
87c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
87d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
87e0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
87f0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
8800: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
8810: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
8820: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
8830: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
8840: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
8850: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
8860: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
8890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
88a0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
88b0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
88c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
88d0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
88e0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
88f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8910: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
8920: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
8930: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
8940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8950: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
8960: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
8970: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
8980: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
8990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
89a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
89b0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
89c0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
89d0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
89e0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
89f0: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
8a00: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
8a10: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
8a20: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
8a30: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
8a40: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
8a50: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
8a60: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
8a70: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
8a80: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
8a90: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
8aa0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
8ab0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
8ac0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
8ad0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
8ae0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
8af0: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
8b00: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
8b10: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
8b20: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
8b30: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
8b40: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
8b50: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
8b60: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
8b70: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
8b80: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
8b90: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
8ba0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
8bb0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
8bc0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
8bd0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
8be0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
8bf0: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
8c00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
8c10: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
8c20: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8c30: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
8c40: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
8c50: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
8c60: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
8c70: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
8c80: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
8c90: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
8ca0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
8cb0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
8cc0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
8cd0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
8ce0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
8cf0: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
8d00: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
8d10: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
8d20: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
8d30: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
8d40: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
8d50: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
8d60: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
8d70: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
8d80: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
8d90: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8db0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
8dc0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
8dd0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
8de0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8df0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8e00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
8e10: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
8e20: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
8e30: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
8e40: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
8e50: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
8e60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8e70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
8e80: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
8e90: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
8ea0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8eb0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
8ec0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
8ed0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8ee0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
8ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8f00: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8f10: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
8f40: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
8f50: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f70: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
8f80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8f90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8fa0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
8fb0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
8fc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8fd0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
8fe0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
8ff0: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
9000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9010: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9020: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9030: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
9040: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
9050: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
9060: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
9070: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9080: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9090: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
90a0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
90b0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
90c0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
90d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
90e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
90f0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
9100: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
9110: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
9120: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
9130: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
9140: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
9150: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
9160: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
9170: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
9180: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
9190: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
91a0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
91b0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
91c0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
91d0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
91e0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
91f0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
9200: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
9210: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
9220: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
9230: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
9240: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
9250: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
9260: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9270: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
9280: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
9290: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
92a0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
92b0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
92c0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
92d0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
92e0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
92f0: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
9300: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
9310: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
9320: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
9330: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
9340: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
9350: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
9360: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
9370: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
9380: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
9390: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
93a0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
93b0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
93c0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
93d0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
93e0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
93f0: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
9400: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
9410: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
9420: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
9430: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
9440: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
9450: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
9460: 2b 31 29 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  +1);.  KeyInfo *
9470: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
9480: 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a  locRawNN(db, siz
9490: 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 6e  eof(KeyInfo) + n
94a0: 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20  Extra);.  if( p 
94b0: 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  ){.    p->aSortO
94c0: 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e  rder = (u8*)&p->
94d0: 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20  aColl[N+X];.    
94e0: 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  p->nField = (u16
94f0: 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65  )N;.    p->nXFie
9500: 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20  ld = (u16)X;.   
9510: 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62   p->enc = ENC(db
9520: 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64  );.    p->db = d
9530: 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d  b;.    p->nRef =
9540: 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   1;.    memset(&
9550: 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29  p[1], 0, nExtra)
9560: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9570: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
9580: 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  b);.  }.  return
9590: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61   p;.}../*.** Dea
95a0: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
95b0: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64  o object.*/.void
95c0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
95d0: 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  nref(KeyInfo *p)
95e0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
95f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
9600: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
9610: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  f--;.    if( p->
9620: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
9630: 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c  3DbFreeNN(p->db,
9640: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
9650: 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69  * Make a new poi
9660: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
9670: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49  o object.*/.KeyI
9680: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
9690: 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a  nfoRef(KeyInfo *
96a0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
96b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
96c0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
96d0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Ref++;.  }.  ret
96e0: 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn p;.}..#ifdef
96f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
9700: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
9710: 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  if a KeyInfo obj
9720: 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67  ect can be chang
9730: 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  e.  The KeyInfo 
9740: 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e  object.** can on
9750: 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66  ly be changed if
9760: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20   this is just a 
9770: 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65  single reference
9780: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a   to the object..
9790: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
97a0: 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
97b0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
97c0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
97d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79  /.int sqlite3Key
97e0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
97f0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74  KeyInfo *p){ ret
9800: 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20  urn p->nRef==1; 
9810: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9820: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
9830: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
9840: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
9850: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
9860: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
9870: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
9880: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
9890: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
98a0: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
98b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
98c0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
98d0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
98e0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
98f0: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
9900: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
9910: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
9920: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
9930: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
9940: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
9950: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
9960: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
9970: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
9980: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9990: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
99a0: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
99b0: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
99c0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
99d0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
99e0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
99f0: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
9a00: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
9a10: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
9a20: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
9a30: 72 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  re is obtained f
9a40: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
9a50: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
9a60: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
9a70: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
9a80: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
9a90: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
9aa0: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
9ab0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
9ac0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
9ad0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
9ae0: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
9af0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9b00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9b10: 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74  t,     /* Form t
9b20: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
9b30: 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72  t from this Expr
9b40: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53  List */.  int iS
9b50: 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f  tart,          /
9b60: 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74 68 69  * Begin with thi
9b70: 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73  s column of pLis
9b80: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  t */.  int nExtr
9b90: 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  a           /* A
9ba0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74  dd this many ext
9bb0: 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68  ra columns to th
9bc0: 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e end */.){.  in
9bd0: 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e  t nExpr;.  KeyIn
9be0: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72  fo *pInfo;.  str
9bf0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9c00: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
9c10: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9c20: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ->db;.  int i;..
9c30: 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d    nExpr = pList-
9c40: 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20  >nExpr;.  pInfo 
9c50: 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
9c60: 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d  Alloc(db, nExpr-
9c70: 69 53 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31  iStart, nExtra+1
9c80: 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29  );.  if( pInfo )
9c90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
9ca0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
9cb0: 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29  iteable(pInfo) )
9cc0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61  ;.    for(i=iSta
9cd0: 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  rt, pItem=pList-
9ce0: 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78  >a+iStart; i<nEx
9cf0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
9d00: 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
9d10: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70   *pColl;.      p
9d20: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
9d30: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
9d40: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
9d50: 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
9d60: 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
9d70: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
9d80: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d   pInfo->aColl[i-
9d90: 69 53 74 61 72 74 5d 20 3d 20 70 43 6f 6c 6c 3b  iStart] = pColl;
9da0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  .      pInfo->aS
9db0: 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72  ortOrder[i-iStar
9dc0: 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  t] = pItem->sort
9dd0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
9de0: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
9df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  .}../*.** Name o
9e00: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9e10: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
9e20: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
9e30: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
9e40: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
9e50: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
9e60: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
9e70: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
9e80: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
9e90: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
9ea0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9eb0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
9ec0: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
9ed0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
9ee0: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
9ef0: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
9f00: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
9f10: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
9f20: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
9f30: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
9f40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
9f50: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
9f60: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
9f70: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
9f80: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
9f90: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
9fa0: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
9fb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
9fc0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
9fd0: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
9fe0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
9ff0: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
a000: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
a010: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
a020: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
a030: 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20  .**   "USE TEMP 
a040: 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a  B-TREE FOR xxx".
a050: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20  **.** where xxx 
a060: 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49  is one of "DISTI
a070: 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22  NCT", "ORDER BY"
a080: 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20   or "GROUP BY". 
a090: 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a  Exactly which.**
a0a0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
a0b0: 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67  y the zUsage arg
a0c0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a0d0: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d   void explainTem
a0e0: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
a0f0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
a100: 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28   *zUsage){.  if(
a110: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
a120: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
a130: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a140: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
a150: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
a160: 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
a170: 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45  "USE TEMP B-TREE
a180: 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65   FOR %s", zUsage
a190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
a1a0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45  beAddOp4(v, OP_E
a1b0: 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
a1c0: 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
a1d0: 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
a1e0: 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
a1f0: 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69   Assign expressi
a200: 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61  on b to lvalue a
a210: 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f  . A second, no-o
a220: 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  p, version of th
a230: 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70  is macro.** is p
a240: 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c  rovided when SQL
a250: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a260: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
a270: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64  s allows the cod
a280: 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53  e.** in sqlite3S
a290: 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67  elect() to assig
a2a0: 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75  n values to stru
a2b0: 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72  cture member var
a2c0: 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f  iables that.** o
a2d0: 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c  nly exist if SQL
a2e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
a2f0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
a300: 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e  without pollutin
a310: 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  g the.** code wi
a320: 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63  th #ifndef direc
a330: 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69  tives..*/.# defi
a340: 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  ne explainSetInt
a350: 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62  eger(a, b) a = b
a360: 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70  ..#else./* No-op
a370: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
a380: 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75   explainXXX() fu
a390: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72  nctions and macr
a3a0: 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  os. */.# define 
a3b0: 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
a3c0: 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65  (y,z).# define e
a3d0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
a3e0: 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69  (y,z).#endif..#i
a3f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a400: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
a410: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
a420: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
a430: 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55  _SELECT)./*.** U
a440: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
a450: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
a460: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
a470: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
a480: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
a490: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
a4a0: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
a4b0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
a4c0: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
a4d0: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
a4e0: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f   caption is of o
a4f0: 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f  ne of the two fo
a500: 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f  rms:.**.**   "CO
a510: 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49  MPOSITE SUBQUERI
a520: 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75  ES iSub1 and iSu
a530: 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43  b2 (op)".**   "C
a540: 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45 52  OMPOSITE SUBQUER
a550: 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69 53  IES iSub1 and iS
a560: 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42  ub2 USING TEMP B
a570: 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a  -TREE (op)".**.*
a580: 2a 20 77 68 65 72 65 20 69 53 75 62 31 20 61 6e  * where iSub1 an
a590: 64 20 69 53 75 62 32 20 61 72 65 20 74 68 65 20  d iSub2 are the 
a5a0: 69 6e 74 65 67 65 72 73 20 70 61 73 73 65 64 20  integers passed 
a5b0: 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  as the correspon
a5c0: 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ding.** function
a5d0: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64   parameters, and
a5e0: 20 6f 70 20 69 73 20 74 68 65 20 74 65 78 74 20   op is the text 
a5f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
a600: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a  f the parameter.
a610: 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ** of the same n
a620: 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74  ame. The paramet
a630: 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20  er "op" must be 
a640: 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  one of TK_UNION,
a650: 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54   TK_EXCEPT,.** T
a660: 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54  K_INTERSECT or T
a670: 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74  K_ALL. The first
a680: 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66   form is used if
a690: 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d   argument bUseTm
a6a0: 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20  p is .** false, 
a6b0: 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f  or the second fo
a6c0: 72 6d 20 69 66 20 69 74 20 69 73 20 74 72 75 65  rm if it is true
a6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a6e0: 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
a6f0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
a700: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
a710: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
a720: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
a730: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
a740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
a750: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
a760: 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f  K_EXCEPT etc. */
a770: 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20  .  int iSub1,   
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a790: 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69     /* Subquery i
a7a0: 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  d 1 */.  int iSu
a7b0: 62 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b2,             
a7c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71           /* Subq
a7d0: 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69  uery id 2 */.  i
a7e0: 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20 20 20  nt bUseTmp      
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a800: 2a 20 54 72 75 65 20 69 66 20 61 20 74 65 6d 70  * True if a temp
a810: 20 74 61 62 6c 65 20 77 61 73 20 75 73 65 64 20   table was used 
a820: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
a830: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20  op==TK_UNION || 
a840: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
a850: 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
a860: 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  T || op==TK_ALL 
a870: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
a880: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
a890: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
a8a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
a8b0: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
a8c0: 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20  ite3MPrintf(.   
a8d0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c       pParse->db,
a8e0: 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55   "COMPOUND SUBQU
a8f0: 45 52 49 45 53 20 25 64 20 41 4e 44 20 25 64 20  ERIES %d AND %d 
a900: 25 73 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20  %s(%s)", iSub1, 
a910: 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62  iSub2,.        b
a920: 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45  UseTmp?"USING TE
a930: 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20  MP B-TREE ":"", 
a940: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29  selectOpName(op)
a950: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
a960: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
a970: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
a980: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
a990: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
a9a0: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  YNAMIC);.  }.}.#
a9b0: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
a9c0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
a9d0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
a9e0: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
a9f0: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
aa00: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c  lainComposite(v,
aa10: 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  w,x,y,z).#endif.
aa20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
aa30: 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e  ner loop was gen
aa40: 65 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e  erated using a n
aa50: 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79  on-null pOrderBy
aa60: 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68   argument,.** th
aa70: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77  en the results w
aa80: 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20  ere placed in a 
aa90: 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74  sorter.  After t
aaa0: 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69  he loop is termi
aab0: 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64  nated.** we need
aac0: 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74   to run the sort
aad0: 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68  er and output th
aae0: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20  e results.  The 
aaf0: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
ab00: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
ab10: 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74  he code needed t
ab20: 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74  o do that..*/.st
ab30: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
ab40: 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61  teSortTail(.  Pa
ab50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ab60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ab70: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
ab80: 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p,        /* The
ab90: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
aba0: 74 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  t */.  SortCtx *
abb0: 70 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f  pSort,   /* Info
abc0: 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f  rmation on the O
abd0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
abe0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
abf0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ac00: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
ac10: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
ac20: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
ac30: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
ac40: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
ac50: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ac60: 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
ac90: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
aca0: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70  nt addrBreak = p
acb0: 53 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b  Sort->labelDone;
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
acd0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
ace0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
acf0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
ad00: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ad10: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
ad20: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
ad30: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
ad40: 72 3b 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63  r;.  int addrOnc
ad50: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61  e = 0;.  int iTa
ad60: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
ad70: 4f 72 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d  OrderBy = pSort-
ad80: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74  >pOrderBy;.  int
ad90: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
ada0: 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61  eDest;.  int iPa
adb0: 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50  rm = pDest->iSDP
adc0: 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  arm;.  int regRo
add0: 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69  w;.  int regRowi
ade0: 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20  d;.  int iCol;. 
adf0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   int nKey;.  int
ae00: 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20   iSortTab;      
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae20: 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f  Sorter cursor to
ae30: 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
ae40: 69 6e 74 20 6e 53 6f 72 74 44 61 74 61 3b 20 20  int nSortData;  
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 2f 2a 20 54 72 61 69 6c 69 6e 67 20 76 61 6c 75  /* Trailing valu
ae70: 65 73 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  es to read from 
ae80: 73 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  sorter */.  int 
ae90: 69 3b 0a 20 20 69 6e 74 20 62 53 65 71 3b 20 20  i;.  int bSeq;  
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
aec0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 69 6e  sorter record in
aed0: 63 6c 75 64 65 73 20 73 65 71 2e 20 6e 6f 2e 20  cludes seq. no. 
aee0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
aef0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45  List_item *aOutE
af00: 78 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  x = p->pEList->a
af10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  ;..  assert( add
af20: 72 42 72 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66  rBreak<0 );.  if
af30: 28 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  ( pSort->labelBk
af40: 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
af50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
af60: 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d  OP_Gosub, pSort-
af70: 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53 6f 72  >regReturn, pSor
af80: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a  t->labelBkOut);.
af90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
afa0: 6f 74 6f 28 76 2c 20 61 64 64 72 42 72 65 61 6b  oto(v, addrBreak
afb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
afc0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
afd0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
afe0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 69 54 61 62  Out);.  }.  iTab
aff0: 20 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73   = pSort->iECurs
b000: 6f 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  or;.  if( eDest=
b010: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
b020: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
b030: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
b040: 54 5f 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 67  T_Mem ){.    reg
b050: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 72  Rowid = 0;.    r
b060: 65 67 52 6f 77 20 3d 20 70 44 65 73 74 2d 3e 69  egRow = pDest->i
b070: 53 64 73 74 3b 0a 20 20 20 20 6e 53 6f 72 74 44  Sdst;.    nSortD
b080: 61 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20  ata = nColumn;. 
b090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52   }else{.    regR
b0a0: 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65  owid = sqlite3Ge
b0b0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
b0c0: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73  ;.    regRow = s
b0d0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
b0e0: 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75  ge(pParse, nColu
b0f0: 6d 6e 29 3b 0a 20 20 20 20 6e 53 6f 72 74 44 61  mn);.    nSortDa
b100: 74 61 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  ta = nColumn;.  
b110: 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f 72 64 65  }.  nKey = pOrde
b120: 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f  rBy->nExpr - pSo
b130: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 69 66  rt->nOBSat;.  if
b140: 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  ( pSort->sortFla
b150: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
b160: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
b170: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
b180: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
b190: 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d 20 70      iSortTab = p
b1a0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
b1b0: 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c 61     if( pSort->la
b1c0: 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20 20  belBkOut ){.    
b1d0: 20 20 61 64 64 72 4f 6e 63 65 20 3d 20 73 71 6c    addrOnce = sql
b1e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
b1f0: 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65  , OP_Once); Vdbe
b200: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
b210: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
b220: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
b230: 70 65 6e 50 73 65 75 64 6f 2c 20 69 53 6f 72 74  penPseudo, iSort
b240: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  Tab, regSortOut,
b250: 20 6e 4b 65 79 2b 31 2b 6e 53 6f 72 74 44 61 74   nKey+1+nSortDat
b260: 61 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  a);.    if( addr
b270: 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  Once ) sqlite3Vd
b280: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
b290: 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61 64 64  drOnce);.    add
b2a0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
b2b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b2c0: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
b2d0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
b2e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b2f0: 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  );.    codeOffse
b300: 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c  t(v, p->iOffset,
b310: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
b320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b330: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp3(v, OP_Sort
b340: 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65  erData, iTab, re
b350: 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72 74 54  gSortOut, iSortT
b360: 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20 3d 20  ab);.    bSeq = 
b370: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
b380: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
b390: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b3a0: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
b3b0: 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43  ddrBreak); VdbeC
b3c0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b3d0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
b3e0: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
b3f0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69 53 6f  ntinue);.    iSo
b400: 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a 20 20  rtTab = iTab;.  
b410: 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20 7d 0a    bSeq = 1;.  }.
b420: 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f 6c 3d    for(i=0, iCol=
b430: 6e 4b 65 79 2b 62 53 65 71 3b 20 69 3c 6e 53 6f  nKey+bSeq; i<nSo
b440: 72 74 44 61 74 61 3b 20 69 2b 2b 29 7b 0a 20 20  rtData; i++){.  
b450: 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 20    int iRead;.   
b460: 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e 75   if( aOutEx[i].u
b470: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29  .x.iOrderByCol )
b480: 7b 0a 20 20 20 20 20 20 69 52 65 61 64 20 3d 20  {.      iRead = 
b490: 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f  aOutEx[i].u.x.iO
b4a0: 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20  rderByCol-1;.   
b4b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
b4c0: 65 61 64 20 3d 20 69 43 6f 6c 2b 2b 3b 0a 20 20  ead = iCol++;.  
b4d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
b4e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
b4f0: 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62  Column, iSortTab
b500: 2c 20 69 52 65 61 64 2c 20 72 65 67 52 6f 77 2b  , iRead, regRow+
b510: 69 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  i);.    VdbeComm
b520: 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 61 4f  ent((v, "%s", aO
b530: 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3f 20  utEx[i].zName ? 
b540: 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e 61 6d 65 20  aOutEx[i].zName 
b550: 3a 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 53 70 61  : aOutEx[i].zSpa
b560: 6e 29 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n));.  }.  switc
b570: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
b580: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
b590: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
b5a0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 73  emTab: {.      s
b5b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b5c0: 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
b5d0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
b5e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b5f0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b600: 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  _Insert, iParm, 
b610: 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64  regRow, regRowid
b620: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b630: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
b640: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
b650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
b670: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
b680: 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74      case SRT_Set
b690: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b6a0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74  ( nColumn==sqlit
b6b0: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73 74  e3Strlen30(pDest
b6c0: 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a 20  ->zAffSdst) );. 
b6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b6e0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
b6f0: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c  eRecord, regRow,
b700: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f 77   nColumn, regRow
b710: 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  id,.            
b720: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
b730: 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43 6f  t->zAffSdst, nCo
b740: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
b750: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
b760: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
b770: 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  se, regRow, nCol
b780: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  umn);.      sqli
b790: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
b7a0: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
b7b0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
b7c0: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
b7d0: 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mn);.      break
b7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b7f0: 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
b800: 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
b810: 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
b820: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
b830: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
b840: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b850: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  f.    default: {
b860: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
b870: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
b880: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
b890: 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20  oroutine ); .   
b8a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
b8b0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
b8c0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
b8d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
b8e0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
b8f0: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
b900: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
b910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b920: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
b930: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
b940: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
b950: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b960: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
b970: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
b980: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
b990: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
b9a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b9b0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
b9c0: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
b9d0: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
b9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b9f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65 67   }.  }.  if( reg
ba00: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66 28  Rowid ){.    if(
ba10: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20   eDest==SRT_Set 
ba20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ba30: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
ba40: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c  (pParse, regRow,
ba50: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d   nColumn);.    }
ba60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
ba70: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ba80: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
ba90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
baa0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
bab0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
bac0: 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  wid);.  }.  /* T
bad0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
bae0: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
baf0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
bb00: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
bb10: 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53 6f  inue);.  if( pSo
bb20: 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20  rt->sortFlags & 
bb30: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
bb40: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
bb50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
bb60: 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54  P_SorterNext, iT
bb70: 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65 43  ab, addr); VdbeC
bb80: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 65  overage(v);.  }e
bb90: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
bba0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
bbb0: 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  _Next, iTab, add
bbc0: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
bbd0: 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  (v);.  }.  if( p
bbe0: 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 20  Sort->regReturn 
bbf0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
bc00: 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
bc10: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
bc20: 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rn);.  sqlite3Vd
bc30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
bc40: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d 0a  , addrBreak);.}.
bc50: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
bc60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
bc70: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
bc80: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
bc90: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
bca0: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
bcb0: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
bcc0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
bcd0: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
bce0: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ler..**.** Also 
bcf0: 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
bd00: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bd10: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61  returned value a
bd20: 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a  nd return that.*
bd30: 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73  * result in *pEs
bd40: 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  tWidth..**.** Th
bd50: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
bd60: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
bd70: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
bd80: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
bd90: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
bda0: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
bdb0: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
bdc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
bdd0: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
bde0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
bdf0: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
be00: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
be10: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
be20: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
be30: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
be40: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
be50: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
be60: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
be70: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
be80: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
be90: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
bea0: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
beb0: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
bec0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
bed0: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
bee0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
bef0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
bf00: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
bf10: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
bf20: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
bf30: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
bf40: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
bf50: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
bf60: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
bf70: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
bf80: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
bf90: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
bfa0: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
bfb0: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
bfc0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
bfd0: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69  s routine has ei
bfe0: 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61  ther 3 or 6 para
bff0: 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67  meters depending
c000: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
c010: 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ot.** the SQLITE
c020: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
c030: 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d  ETADATA compile-
c040: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75  time option is u
c050: 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
c060: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c070: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64  UMN_METADATA.# d
c080: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
c090: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
c0a0: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
c0b0: 2c 43 2c 44 2c 45 2c 46 29 0a 23 65 6c 73 65 20  ,C,D,E,F).#else 
c0c0: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
c0d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
c0e0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
c0f0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
c100: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
c110: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
c120: 28 41 2c 42 2c 46 29 0a 23 65 6e 64 69 66 0a 73  (A,B,F).#endif.s
c130: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c140: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
c150: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
c160: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
c170: 45 78 70 72 2c 0a 23 69 66 64 65 66 20 53 51 4c  Expr,.#ifdef SQL
c180: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
c190: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 6f 6e  N_METADATA.  con
c1a0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
c1b0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
c1c0: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
c1d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
c1e0: 72 69 67 43 6f 6c 2c 0a 23 65 6e 64 69 66 0a 20  rigCol,.#endif. 
c1f0: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
c200: 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  {.  char const *
c210: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
c220: 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74   j;.  u8 estWidt
c230: 68 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51  h = 1;.#ifdef SQ
c240: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
c250: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 63 68  MN_METADATA.  ch
c260: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44  ar const *zOrigD
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 54 61 62 20 3d 20  nst *zOrigTab = 
c290: 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
c2a0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23  *zOrigCol = 0;.#
c2b0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
c2c0: 20 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 61   pExpr!=0 );.  a
c2d0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63  ssert( pNC->pSrc
c2e0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 73 77 69  List!=0 );.  swi
c2f0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
c300: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  {.    case TK_AG
c310: 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  G_COLUMN:.    ca
c320: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
c330: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c340: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
c350: 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20  umn. Locate the 
c360: 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e  table the column
c370: 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   is being.      
c380: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ** extracted fro
c390: 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74  m in NameContext
c3a0: 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20  .pSrcList. This 
c3b0: 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61  table may be rea
c3c0: 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  l.      ** datab
c3d0: 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73  ase table or a s
c3e0: 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a  ubquery..      *
c3f0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
c400: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
c410: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72      /* Table str
c420: 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73  ucture column is
c430: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
c440: 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  */.      Select 
c450: 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *pS = 0;        
c460: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74       /* Select t
c470: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  he column is ext
c480: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
c490: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
c4a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20  pExpr->iColumn; 
c4b0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
c4c0: 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20  umn in pTab */. 
c4d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c4e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47  Expr->op==TK_AGG
c4f0: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
c500: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
c510: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
c520: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
c530: 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a  pNC && !pTab ){.
c540: 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20          SrcList 
c550: 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d  *pTabList = pNC-
c560: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
c570: 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61     for(j=0;j<pTa
c580: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
c590: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
c5a0: 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54  ursor!=pExpr->iT
c5b0: 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20  able;j++);.     
c5c0: 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73     if( j<pTabLis
c5d0: 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20  t->nSrc ){.     
c5e0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
c5f0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
c600: 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20  .          pS = 
c610: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
c620: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
c630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c640: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
c650: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
c660: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
c670: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pTab==0 ){.     
c680: 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d     /* At one tim
c690: 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20  e, code such as 
c6a0: 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77  "SELECT new.x" w
c6b0: 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20  ithin a trigger 
c6c0: 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  would.        **
c6d0: 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64   cause this cond
c6e0: 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53  ition to run.  S
c6f0: 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61  ince then, we ha
c700: 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20  ve restructured 
c710: 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  how.        ** t
c720: 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67  rigger code is g
c730: 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20  enerated and so 
c740: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
c750: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20  s no longer .   
c760: 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65       ** possible
c770: 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61  . However, it ca
c780: 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20  n still be true 
c790: 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c  for statements l
c7a0: 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ike.        ** t
c7b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  he following:.  
c7c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
c7d0: 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
c7e0: 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45  LE t1(col INTEGE
c7f0: 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  R);.        **  
c800: 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20   SELECT (SELECT 
c810: 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f  t1.col) FROM FRO
c820: 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a  M t1;.        **
c830: 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  .        ** when
c840: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
c850: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
c860: 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f  xpression "t1.co
c870: 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20  l" in the .     
c880: 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
c890: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
c8a0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  set the column t
c8b0: 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65  ype to NULL, eve
c8c0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f  n.        ** tho
c8d0: 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65  ugh it should re
c8e0: 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52  ally be "INTEGER
c8f0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  "..        **.  
c900: 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
c910: 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20   not a problem, 
c920: 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  as the column ty
c930: 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69  pe of "t1.col" i
c940: 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20  s never.        
c950: 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f  ** used. When co
c960: 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61  lumnType() is ca
c970: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72  lled on the expr
c980: 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20  ession .        
c990: 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63  ** "(SELECT t1.c
c9a0: 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63  ol)", the correc
c9b0: 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e  t type is return
c9c0: 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53  ed (see the TK_S
c9d0: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a  ELECT.        **
c9e0: 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20   branch below.  
c9f0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ca00: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
ca10: 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
ca20: 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54   pExpr->pTab==pT
ca30: 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ab );.      if( 
ca40: 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pS ){.        /*
ca50: 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20   The "table" is 
ca60: 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73  actually a sub-s
ca70: 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20  elect or a view 
ca80: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
ca90: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  se.        ** of
caa0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
cab0: 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68  ement. Return th
cac0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
cad0: 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20  pe and origin.  
cae0: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f        ** data fo
caf0: 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  r the result-set
cb00: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73   column of the s
cb10: 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20  ub-select..     
cb20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
cb30: 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57  ( iCol>=0 && ALW
cb40: 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c  AYS(iCol<pS->pEL
cb50: 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
cb60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
cb70: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
cb80: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
cb90: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
cba0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
cbb0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
cbc0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
cbd0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
cbe0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
cbf0: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
cc00: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
cc10: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
cc20: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
cc30: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
cc40: 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
cc50: 54 68 65 20 41 4c 57 41 59 53 28 29 20 69 73 20  The ALWAYS() is 
cc60: 62 65 63 61 75 73 65 20 69 43 6f 6c 3e 3d 70 53  because iCol>=pS
cc70: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cc80: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 0a 20  will have been. 
cc90: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 67           ** caug
cca0: 68 74 20 61 6c 72 65 61 64 79 20 62 79 20 6e 61  ht already by na
ccb0: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 20  me resolution.. 
ccc0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
ccd0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
cce0: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
ccf0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
cd00: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
cd10: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
cd20: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
cd30: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
cd40: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
cd50: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
cd60: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
cd70: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
cd80: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
cd90: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
cda0: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
cdb0: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
cdc0: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20  idth); .        
cdd0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
cde0: 28 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ( pTab->pSchema 
cdf0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
ce00: 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  real table */.  
ce10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
ce20: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  S );.        if(
ce30: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
ce40: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
ce50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43        assert( iC
ce60: 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e  ol==-1 || (iCol>
ce70: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d  =0 && iCol<pTab-
ce80: 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66  >nCol) );.#ifdef
ce90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
cea0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
ceb0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
cec0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
ced0: 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22  Type = "INTEGER"
cee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
cef0: 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a  gCol = "rowid";.
cf00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cf10: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
cf20: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
cf30: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
cf40: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
cf50: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
cf60: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
cf70: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
cf80: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
cf90: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
cfa0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
cfb0: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
cfc0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
cfd0: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
cfe0: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
cff0: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
d000: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
d010: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
d020: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
d030: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
d040: 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  gDb = pNC->pPars
d050: 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
d060: 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zDbSName;.      
d070: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
d080: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
d090: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
d0a0: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
d0b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d0c0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71        zType = sq
d0d0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
d0e0: 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
d0f0: 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ],0);.          
d100: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
d110: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
d120: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
d130: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
d140: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
d150: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d160: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
d170: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
d180: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
d190: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
d1a0: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
d1b0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
d1c0: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
d1d0: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
d1e0: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
d1f0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
d200: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
d210: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
d220: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
d230: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
d240: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
d250: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
d260: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
d270: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
d280: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
d290: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
d2a0: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
d2b0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
d2c0: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
d2d0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
d2e0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
d2f0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
d300: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
d310: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
d320: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
d330: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d340: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
d350: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
d360: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
d370: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
d380: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
d390: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d3a0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
d3b0: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
d3c0: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
d3d0: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
d3e0: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
d3f0: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
d400: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
d410: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
d420: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
d430: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
d440: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
d450: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
d460: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
d470: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
d480: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
d490: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
d4a0: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
d4b0: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
d4c0: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
d4d0: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
d4e0: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
d4f0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
d500: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
d510: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d520: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
d530: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
d540: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
d550: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
d560: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
d570: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
d580: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
d590: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d5a0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
d5b0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
d5c0: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
d5d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d5e0: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
d5f0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
d600: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
d610: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
d620: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e  e = pParse;.  sN
d630: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66  C.pNext = 0;.  f
d640: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
d650: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
d660: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
d670: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
d680: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
d690: 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53  *zType;.#ifdef S
d6a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
d6b0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
d6c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
d6d0: 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  igDb = 0;.    co
d6e0: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54  nst char *zOrigT
d6f0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ab = 0;.    cons
d700: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c  t char *zOrigCol
d710: 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20   = 0;.    zType 
d720: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
d730: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
d740: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
d750: 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  gCol, 0);..    /
d760: 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20  * The vdbe must 
d770: 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70  make its own cop
d780: 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d  y of the column-
d790: 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a  type and other .
d7a0: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70      ** column sp
d7b0: 65 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20  ecific strings, 
d7c0: 69 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65  in case the sche
d7d0: 6d 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f  ma is reset befo
d7e0: 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76  re this.    ** v
d7f0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69  irtual machine i
d800: 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  s deleted..    *
d810: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
d820: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
d830: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41  , COLNAME_DATABA
d840: 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c  SE, zOrigDb, SQL
d850: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
d870: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
d880: 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a  COLNAME_TABLE, z
d890: 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f  OrigTab, SQLITE_
d8a0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d8b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
d8c0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
d8d0: 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69  AME_COLUMN, zOri
d8e0: 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  gCol, SQLITE_TRA
d8f0: 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20  NSIENT);.#else. 
d900: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
d910: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30  nType(&sNC, p, 0
d920: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  , 0, 0, 0);.#end
d930: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  if.    sqlite3Vd
d940: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
d950: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54  i, COLNAME_DECLT
d960: 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49  YPE, zType, SQLI
d970: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d980: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
d990: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d9a0: 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d  T_DECLTYPE) */.}
d9b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
d9c0: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 63 74  he Table objecct
d9d0: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
d9e0: 74 68 61 74 20 68 61 73 20 63 75 72 73 6f 72 20  that has cursor 
d9f0: 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 4f 72 20 72  iCursor..** Or r
da00: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
da10: 20 73 75 63 68 20 54 61 62 6c 65 20 6f 62 6a 65   such Table obje
da20: 63 74 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ct exists in the
da30: 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 73 74 61   SrcList..*/.sta
da40: 74 69 63 20 54 61 62 6c 65 20 2a 74 61 62 6c 65  tic Table *table
da50: 57 69 74 68 43 75 72 73 6f 72 28 53 72 63 4c 69  WithCursor(SrcLi
da60: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
da70: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 6a  Cursor){.  int j
da80: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  ;.  for(j=0; j<p
da90: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 29  List->nSrc; j++)
daa0: 7b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  {.    if( pList-
dab0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 69  >a[j].iCursor==i
dac0: 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
dad0: 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  pList->a[j].pTab
dae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
daf0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
db00: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
db10: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
db20: 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63  E the names of c
db30: 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65  olumns.** in the
db40: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
db50: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
db60: 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64  s used to provid
db70: 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d  e the.** azCol[]
db80: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63   values in the c
db90: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  allback..*/.stat
dba0: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
dbb0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50  ColumnNames(.  P
dbc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dbd0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
dbe0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
dbf0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
dc00: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
dc10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
dc20: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
dc30: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
dc40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
dc50: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
dc60: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
dc70: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61 62 6c  .  int i;.  Tabl
dc80: 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74  e *pTab;.  sqlit
dc90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
dca0: 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e  >db;.  int fullN
dcb0: 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73  ames, shortNames
dcc0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
dcd0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
dce0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
dcf0: 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20  n EXPLAIN, skip 
dd00: 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69  this step */.  i
dd10: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
dd20: 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  in ){.    return
dd30: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
dd40: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
dd50: 61 6d 65 73 53 65 74 20 7c 7c 20 64 62 2d 3e 6d  amesSet || db->m
dd60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
dd70: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
dd80: 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  v!=0 );.  assert
dd90: 28 20 70 54 61 62 4c 69 73 74 21 3d 30 20 29 3b  ( pTabList!=0 );
dda0: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
ddb0: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
ddc0: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
ddd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
dde0: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
ddf0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
de00: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
de10: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
de20: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
de30: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
de40: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
de50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
de60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
de70: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
de80: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
de90: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
dea0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
deb0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
dec0: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
ded0: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
dee0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
def0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
df00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
df10: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
df20: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
df30: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
df40: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
df50: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
df60: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
df70: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
df80: 55 4d 4e 29 0a 20 20 20 20 20 20 20 20 20 20 20  UMN).           
df90: 26 26 20 28 70 54 61 62 20 3d 20 74 61 62 6c 65  && (pTab = table
dfa0: 57 69 74 68 43 75 72 73 6f 72 28 70 54 61 62 4c  WithCursor(pTabL
dfb0: 69 73 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 29  ist, p->iTable))
dfc0: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
dfd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
dfe0: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
dff0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
e000: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
e010: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
e020: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
e030: 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c  Col==-1 || (iCol
e040: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
e050: 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20  ->nCol) );.     
e060: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
e070: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72         zCol = "r
e080: 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
e090: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  se{.        zCol
e0a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
e0b0: 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ol].zName;.     
e0c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 68   }.      if( !sh
e0d0: 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c  ortNames && !ful
e0e0: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
e0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
e100: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
e110: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
e120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e130: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c  DbStrDup(db, pEL
e140: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
e150: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e160: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e170: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a  f( fullNames ){.
e180: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
e190: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
e1a0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
e1b0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
e1c0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
e1d0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
e1e0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
e1f0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
e200: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
e210: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
e220: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
e230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e240: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
e250: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
e260: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
e270: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
e280: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
e290: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e2a0: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
e2b0: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
e2c0: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
e2d0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
e2e0: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
e2f0: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
e300: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
e310: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
e320: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
e330: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
e340: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
e350: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
e360: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
e370: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
e380: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
e390: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
e3a0: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
e3b0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
e3c0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
e3d0: 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
e3e0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
e3f0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
e400: 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
e410: 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
e420: 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
e430: 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
e440: 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
e450: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
e460: 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
e470: 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
e480: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
e490: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
e4a0: 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
e4b0: 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
e4c0: 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
e4d0: 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
e4e0: 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
e4f0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
e500: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
e510: 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
e520: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
e530: 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
e540: 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
e550: 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
e560: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
e570: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e  ITE_NOMEM..*/.in
e580: 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73  t sqlite3Columns
e590: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20  FromExprList(.  
e5a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e5b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e5c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e5d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
e5e0: 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20  ,       /* Expr 
e5f0: 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20  list from which 
e600: 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e  to derive column
e610: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20   names */.  i16 
e620: 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  *pnCol,         
e630: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e640: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
e650: 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c  ns here */.  Col
e660: 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20  umn **paCol     
e670: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
e680: 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73  e new column lis
e690: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73  t here */.){.  s
e6a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e6b0: 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61  rse->db;   /* Da
e6c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e6d0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  n */.  int i, j;
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e700: 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74  ers */.  u32 cnt
e710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e720: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64       /* Index ad
e730: 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  ded to make the 
e740: 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20  name unique */. 
e750: 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a   Column *aCol, *
e760: 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  pCol;        /* 
e770: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
e780: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
e790: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  */.  int nCol;  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
e7c0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
e7d0: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
e7e0: 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
e7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
e800: 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e  ession for a sin
e810: 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  gle result colum
e820: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  n */.  char *zNa
e830: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
e840: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d     /* Column nam
e850: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
e860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e870: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61     /* Size of na
e880: 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f  me in zName[] */
e890: 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20 20  .  Hash ht;     
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e8b0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66 20  * Hash table of 
e8c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
e8d0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
e8e0: 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20 70  it(&ht);.  if( p
e8f0: 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f  EList ){.    nCo
e900: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
e910: 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71  r;.    aCol = sq
e920: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
e930: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f  o(db, sizeof(aCo
e940: 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  l[0])*nCol);.   
e950: 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d   testcase( aCol=
e960: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
e970: 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20     nCol = 0;.   
e980: 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20   aCol = 0;.  }. 
e990: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 3d 3d 28   assert( nCol==(
e9a0: 69 31 36 29 6e 43 6f 6c 20 29 3b 0a 20 20 2a 70  i16)nCol );.  *p
e9b0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
e9c0: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
e9d0: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
e9e0: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20 26 26 20 21  Col; i<nCol && !
e9f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ea00: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
ea10: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
ea20: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
ea30: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
ea40: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c    */.    p = sql
ea50: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
ea60: 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
ea70: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
ea80: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
ea90: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
eaa0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
eab0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
eac0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
ead0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
eae0: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
eaf0: 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e */.    }else{.
eb00: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
eb10: 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68  Expr = p;  /* Th
eb20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
eb30: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
eb40: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
eb50: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
eb60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
eb70: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
eb80: 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69  th this expressi
eb90: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  on */.      whil
eba0: 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  e( pColExpr->op=
ebb0: 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
ebc0: 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43     pColExpr = pC
ebd0: 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
ebe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ebf0: 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  pColExpr!=0 );. 
ec00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ec10: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
ec20: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 43 6f 6c  K_COLUMN && pCol
ec30: 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 20 29 7b  Expr->pTab!=0 ){
ec40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
ec50: 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20  columns use the 
ec60: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65  column name name
ec70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
ec80: 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d  iCol = pColExpr-
ec90: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
eca0: 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70    pTab = pColExp
ecb0: 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  r->pTab;.       
ecc0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
ecd0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
ece0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
ecf0: 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62  = iCol>=0 ? pTab
ed00: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
ed10: 6d 65 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20  me : "rowid";.  
ed20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
ed30: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
ed40: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
ed50: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
ed60: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
ed70: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
ed80: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ed90: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
eda0: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
edb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
edc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
edd0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
ede0: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
edf0: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
ee00: 20 20 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74    zName = pEList
ee10: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20  ->a[i].zSpan;.  
ee20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ee30: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
ee40: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
ee50: 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a   zName);..    /*
ee60: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
ee70: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e  olumn name is un
ee80: 69 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61  ique.  If the na
ee90: 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65  me is not unique
eea0: 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20  ,.    ** append 
eeb0: 61 6e 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68  an integer to th
eec0: 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69  e name so that i
eed0: 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65  t becomes unique
eee0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74  ..    */.    cnt
eef0: 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
ef00: 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65   zName && sqlite
ef10: 33 48 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a  3HashFind(&ht, z
ef20: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
ef30: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
ef40: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ef50: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d  ;.      if( nNam
ef60: 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  e>0 ){.        f
ef70: 6f 72 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e  or(j=nName-1; j>
ef80: 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  0 && sqlite3Isdi
ef90: 67 69 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a  git(zName[j]); j
efa0: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
efb0: 28 20 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20  ( zName[j]==':' 
efc0: 29 20 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20  ) nName = j;.   
efd0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65     }.      zName
efe0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
eff0: 66 28 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c  f(db, "%.*z:%u",
f000: 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b   nName, zName, +
f010: 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  +cnt);.      if(
f020: 20 63 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33   cnt>3 ) sqlite3
f030: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
f040: 6f 66 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a  of(cnt), &cnt);.
f050: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
f060: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
f070: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
f080: 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61  PropertiesFromNa
f090: 6d 65 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20  me(0, pCol);.   
f0a0: 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71   if( zName && sq
f0b0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
f0c0: 26 68 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c  &ht, zName, pCol
f0d0: 29 3d 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20  )==pCol ){.     
f0e0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
f0f0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
f100: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
f110: 61 72 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64  ar(&ht);.  if( d
f120: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f130: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
f140: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
f150: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f160: 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  b, aCol[j].zName
f170: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f180: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
f190: 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c  Col);.    *paCol
f1a0: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c   = 0;.    *pnCol
f1b0: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
f1c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
f1d0: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
f1e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f1f0: 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e  *.** Add type an
f200: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f  d collation info
f210: 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c  rmation to a col
f220: 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f  umn list based o
f230: 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  n.** a SELECT st
f240: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20  atement..** .** 
f250: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
f260: 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20  presumably came 
f270: 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d  from selectColum
f280: 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69  nNamesFromExprLi
f290: 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c  st()..** The col
f2a0: 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c  umn list has onl
f2b0: 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70  y names, not typ
f2c0: 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73  es or collations
f2d0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
f2e0: 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20  ne goes through 
f2f0: 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70  and adds the typ
f300: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
f310: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
f320: 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74  utine requires t
f330: 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69  hat all identifi
f340: 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ers in the SELEC
f350: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62  T.** statement b
f360: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76  e resolved..*/.v
f370: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
f380: 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
f390: 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61  dCollation(.  Pa
f3a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f3b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
f3c0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62  ontexts */.  Tab
f3d0: 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20  le *pTab,       
f3e0: 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e     /* Add column
f3f0: 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f   type informatio
f400: 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  n to this table 
f410: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
f420: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45  lect       /* SE
f430: 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74  LECT used to det
f440: 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64  ermine types and
f450: 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29   collations */.)
f460: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
f470: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
f480: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
f490: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
f4a0: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
f4b0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  l;.  int i;.  Ex
f4c0: 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20  pr *p;.  struct 
f4d0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
f4e0: 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20  ;.  u64 szAll = 
f4f0: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  0;..  assert( pS
f500: 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73  elect!=0 );.  as
f510: 73 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e  sert( (pSelect->
f520: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
f530: 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20  solved)!=0 );.  
f540: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
f550: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
f560: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
f570: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f580: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
f590: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
f5a0: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
f5b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
f5c0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
f5d0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
f5e0: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
f5f0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
f600: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(i=0, pCol=pTa
f610: 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d  b->aCol; i<pTab-
f620: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
f630: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
f640: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
f650: 69 6e 74 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20  int n, m;.    p 
f660: 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[i].pExpr;.  
f670: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
f680: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
f690: 20 30 2c 20 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a   0, 0, &pCol->sz
f6a0: 45 73 74 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20  Est);.    szAll 
f6b0: 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  += pCol->szEst;.
f6c0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
f6d0: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
f6e0: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
f6f0: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 28 6d   if( zType && (m
f700: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f710: 33 30 28 7a 54 79 70 65 29 29 3e 30 20 29 7b 0a  30(zType))>0 ){.
f720: 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65        n = sqlite
f730: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e  3Strlen30(pCol->
f740: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43  zName);.      pC
f750: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ol->zName = sqli
f760: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
f770: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  ee(db, pCol->zNa
f780: 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20  me, n+m+2);.    
f790: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d    if( pCol->zNam
f7a0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e ){.        mem
f7b0: 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  cpy(&pCol->zName
f7c0: 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b  [n+1], zType, m+
f7d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  1);.        pCol
f7e0: 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ->colFlags |= CO
f7f0: 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20  LFLAG_HASTYPE;. 
f800: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f810: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
f820: 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61  ity==0 ) pCol->a
f830: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
f840: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 70  _AFF_BLOB;.    p
f850: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
f860: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
f870: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , p);.    if( pC
f880: 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f  oll && pCol->zCo
f890: 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ll==0 ){.      p
f8a0: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
f8b0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
f8c0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
f8d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
f8e0: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
f8f0: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
f900: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
f910: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
f920: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
f930: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
f940: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
f950: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
f960: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
f970: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
f980: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
f990: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
f9a0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
f9b0: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
f9c0: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
f9d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
f9e0: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
f9f0: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
fa00: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
fa10: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
fa20: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
fa30: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
fa40: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
fa50: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
fa60: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
fa70: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
fa80: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
fa90: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
faa0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
fab0: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
fac0: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
fad0: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
fae0: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
faf0: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
fb00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
fb10: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
fb20: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
fb30: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
fb40: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
fb50: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
fb60: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
fb70: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
fb80: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
fb90: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
fba0: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
fbb0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
fbc0: 44 69 73 61 62 6c 65 20 29 3b 0a 20 20 70 54 61  Disable );.  pTa
fbd0: 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
fbe0: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
fbf0: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0;.  pTab->nRowL
fc00: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
fc10: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
fc20: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
fc30: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   );.  sqlite3Col
fc40: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
fc50: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
fc60: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
fc70: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
fc80: 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ol);.  sqlite3Se
fc90: 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
fca0: 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
fcb0: 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c  arse, pTab, pSel
fcc0: 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  ect);.  pTab->iP
fcd0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  Key = -1;.  if( 
fce0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fcf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
fd00: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
fd10: 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Tab);.    return
fd20: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
fd30: 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pTab;.}../*.** 
fd40: 47 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74  Get a VDBE for t
fd50: 68 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20  he given parser 
fd60: 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65  context.  Create
fd70: 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
fd80: 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61  cessary..** If a
fd90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
fda0: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
fdb0: 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20  leave a message 
fdc0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 73 74  in pParse..*/.st
fdd0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
fde0: 4c 49 4e 45 20 56 64 62 65 20 2a 61 6c 6c 6f 63  LINE Vdbe *alloc
fdf0: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
fe00: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
fe10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d   pParse->pVdbe =
fe20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 72 65 61   sqlite3VdbeCrea
fe30: 74 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  te(pParse);.  if
fe40: 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( v ) sqlite3Vdb
fe50: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
fe60: 69 74 2c 20 30 2c 20 31 29 3b 0a 20 20 69 66 28  it, 0, 1);.  if(
fe70: 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
fe80: 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74 69  el==0.   && Opti
fe90: 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
fea0: 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54  pParse->db,SQLIT
feb0: 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
fec0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ).  ){.    pPars
fed0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72  e->okConstFactor
fee0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
fef0: 72 6e 20 76 3b 0a 7d 0a 56 64 62 65 20 2a 73 71  rn v;.}.Vdbe *sq
ff00: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
ff10: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
ff20: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
ff30: 3e 70 56 64 62 65 3b 0a 20 20 72 65 74 75 72 6e  >pVdbe;.  return
ff40: 20 76 20 3f 20 76 20 3a 20 61 6c 6c 6f 63 56 64   v ? v : allocVd
ff50: 62 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 0a  be(pParse);.}...
ff60: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
ff70: 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  e iLimit and iOf
ff80: 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74  fset fields of t
ff90: 68 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20  he SELECT based 
ffa0: 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74  on the.** pLimit
ffb0: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70   and pOffset exp
ffc0: 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69  ressions.  pLimi
ffd0: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f  t and pOffset ho
ffe0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
fff0: 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61  ns.** that appea
10000 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  r in the origina
10010 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  l SQL statement 
10020 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20  after the LIMIT 
10030 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65  and OFFSET.** ke
10040 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c  ywords.  Or NULL
10050 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72   if those keywor
10060 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20  ds are omitted. 
10070 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
10080 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69  et .** are the i
10090 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65  nteger memory re
100a0 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66  gister numbers f
100b0 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  or counters used
100c0 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20   to compute .** 
100d0 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66  the limit and of
100e0 66 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20  fset.  If there 
100f0 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f  is no limit and/
10100 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20  or offset, then 
10110 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  .** iLimit and i
10120 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74  Offset are negat
10130 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
10140 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20  routine changes 
10150 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c  the values of iL
10160 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
10170 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69   only if.** a li
10180 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73  mit or offset is
10190 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d   defined by pLim
101a0 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20  it and pOffset. 
101b0 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69   iLimit and.** i
101c0 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61  Offset should ha
101d0 76 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74  ve been preset t
101e0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65  o appropriate de
101f0 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65  fault values (ze
10200 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ro).** prior to 
10210 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
10220 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tine..**.** The 
10230 69 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72  iOffset register
10240 20 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20   (if it exists) 
10250 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
10260 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f  o the value.** o
10270 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54  f the OFFSET.  T
10280 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74  he iLimit regist
10290 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
102a0 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67  d to LIMIT.  Reg
102b0 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74  ister.** iOffset
102c0 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  +1 is initialize
102d0 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45  d to LIMIT+OFFSE
102e0 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66  T..**.** Only if
102f0 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f   pLimit!=0 or pO
10300 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20  ffset!=0 do the 
10310 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
10320 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64  get.** redefined
10330 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  .  The UNION ALL
10340 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74   operator uses t
10350 68 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20  his property to 
10360 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75  force.** the reu
10370 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c  se of the same l
10380 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20  imit and offset 
10390 72 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73  registers across
103a0 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c   multiple.** SEL
103b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
103c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
103d0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
103e0 74 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72  ters(Parse *pPar
103f0 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  se, Select *p, i
10400 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64  nt iBreak){.  Vd
10410 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74  be *v = 0;.  int
10420 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69   iLimit = 0;.  i
10430 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e  nt iOffset;.  in
10440 74 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  t n;.  if( p->iL
10450 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
10460 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
10470 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
10480 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
10490 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
104a0 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
104b0 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
104c0 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
104d0 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
104e0 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
104f0 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
10500 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
10510 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
10520 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
10530 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
10540 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
10550 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
10560 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
10570 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
10580 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
10590 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
105a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
105b0 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
105c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
105d0 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30      assert( v!=0
105e0 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
105f0 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
10600 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20  (p->pLimit, &n) 
10610 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10620 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10630 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69  _Integer, n, iLi
10640 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  mit);.      Vdbe
10650 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d  Comment((v, "LIM
10660 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  IT counter"));. 
10670 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
10680 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10690 56 64 62 65 47 6f 74 6f 28 76 2c 20 69 42 72 65  VdbeGoto(v, iBre
106a0 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ak);.      }else
106b0 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d 3e   if( n>=0 && p->
106c0 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71 6c 69 74  nSelectRow>sqlit
106d0 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e 29  e3LogEst((u64)n)
106e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
106f0 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
10700 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
10710 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  );.        p->se
10720 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 46 69 78  lFlags |= SF_Fix
10730 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d  edLimit;.      }
10740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10750 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
10760 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
10770 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
10780 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10790 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
107a0 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20  BeInt, iLimit); 
107b0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
107c0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
107d0 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
107e0 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
107f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10800 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
10810 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
10820 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
10830 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10840 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
10850 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
10860 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
10870 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
10880 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
10890 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
108a0 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
108b0 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
108c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
108d0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
108e0 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
108f0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
10900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
10910 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
10920 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
10930 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
10940 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10950 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
10960 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r"));.      sqli
10970 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
10980 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c   OP_OffsetLimit,
10990 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
109a0 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  +1, iOffset);.  
109b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
109c0 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
109d0 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  T"));.    }.  }.
109e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
109f0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
10a00 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
10a10 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
10a20 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
10a30 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
10a40 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
10a50 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
10a60 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
10a70 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
10a80 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
10a90 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
10aa0 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
10ab0 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
10ac0 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
10ad0 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
10ae0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
10af0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
10b00 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
10b10 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
10b20 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
10b30 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
10b40 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
10b50 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
10b60 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
10b70 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
10b80 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
10b90 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
10ba0 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
10bb0 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
10bc0 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
10bd0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
10be0 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
10bf0 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
10c00 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
10c10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
10c20 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f  l>=0 );.  /* iCo
10c30 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74  l must be less t
10c40 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  han p->pEList->n
10c50 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65  Expr.  Otherwise
10c60 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a   an error would.
10c70 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74    ** have been t
10c80 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d  hrown during nam
10c90 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64  e resolution and
10ca0 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61   we would not ha
10cb0 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74  ve gotten.  ** t
10cc0 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28  his far */.  if(
10cd0 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41   pRet==0 && ALWA
10ce0 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73  YS(iCol<p->pELis
10cf0 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20  t->nExpr) ){.   
10d00 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45   pRet = sqlite3E
10d10 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
10d20 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
10d30 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20  iCol].pExpr);.  
10d40 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  }.  return pRet;
10d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
10d60 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
10d70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
10d80 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
10d90 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
10da0 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52  CT.** with an OR
10db0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54  DER BY clause. T
10dc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
10dd0 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
10de0 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20  ns a KeyInfo.** 
10df0 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62  structure suitab
10e00 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74  le for implement
10e10 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
10e20 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
10e30 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
10e40 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
10e50 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
10e60 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67  loc. The calling
10e70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
10e80 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
10e90 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68  ensuring that th
10ea0 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20  is structure is 
10eb0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72  eventually.** fr
10ec0 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b  eed..*/.static K
10ed0 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c  eyInfo *multiSel
10ee0 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
10ef0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
10f00 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
10f10 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c  nExtra){.  ExprL
10f20 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
10f30 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69  p->pOrderBy;.  i
10f40 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d  nt nOrderBy = p-
10f50 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
10f60 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10f70 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
10f80 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20  KeyInfo *pRet = 
10f90 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
10fa0 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
10fb0 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
10fc0 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69  f( pRet ){.    i
10fd0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
10fe0 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
10ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
11000 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
11010 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72  *pItem = &pOrder
11020 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  By->a[i];.      
11030 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49  Expr *pTerm = pI
11040 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
11050 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
11060 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  ;..      if( pTe
11070 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43  rm->flags & EP_C
11080 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20  ollate ){.      
11090 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
110a0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
110b0 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  rse, pTerm);.   
110c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
110d0 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53    pColl = multiS
110e0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
110f0 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75  rse, p, pItem->u
11100 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
11110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11120 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20  Coll==0 ) pColl 
11130 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
11140 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
11150 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
11160 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11170 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
11180 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54  tring(pParse, pT
11190 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  erm, pColl->zNam
111a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
111b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
111c0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
111d0 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20  ble(pRet) );.   
111e0 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69     pRet->aColl[i
111f0 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  ] = pColl;.     
11200 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65   pRet->aSortOrde
11210 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
11220 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
11230 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
11240 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
11250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11260 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T_CTE./*.** This
11270 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
11280 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  es VDBE code to 
11290 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74  compute the cont
112a0 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45  ent of a WITH RE
112b0 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79  CURSIVE.** query
112c0 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
112d0 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65  .**   <recursive
112e0 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74  -table> AS (<set
112f0 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20  up-query> UNION 
11300 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65  [ALL] <recursive
11310 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20  -query>).**     
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
11340 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f  /             \_
11350 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a  ______________/.
11360 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
11380 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
11390 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a              p.**
113a0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
113b0 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65  exactly one refe
113c0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63  rence to the rec
113d0 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20  ursive-table in 
113e0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
113f0 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d  ** of recursive-
11400 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69  query, marked wi
11410 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e  th the SrcList->
11420 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  a[].fg.isRecursi
11430 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54  ve flag..**.** T
11440 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72  he setup-query r
11450 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65  uns once to gene
11460 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20  rate an initial 
11470 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74  set of rows that
11480 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75   go.** into a Qu
11490 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73  eue table.  Rows
114a0 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66   are extracted f
114b0 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61  rom the Queue ta
114c0 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e  ble one by.** on
114d0 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74  e.  Each row ext
114e0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
114f0 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70  e is output to p
11500 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Dest.  Then the 
11510 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63  single.** extrac
11520 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20  ted row (now in 
11530 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62  the iCurrent tab
11540 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20  le) becomes the 
11550 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a  content of the.*
11560 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  * recursive-tabl
11570 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76  e for a recursiv
11580 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68  e-query run.  Th
11590 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
115a0 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a  recursive-query.
115b0 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b  ** is added back
115c0 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
115d0 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f  table.  Then ano
115e0 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72  ther row is extr
115f0 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
11600 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72  .** and the iter
11610 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20  ation continues 
11620 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
11630 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
11640 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
11650 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72  pound query oper
11660 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68  ator is UNION th
11670 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20  en no duplicate 
11680 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a  rows are ever.**
11690 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74   inserted into t
116a0 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20  he Queue table. 
116b0 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74   The iDistinct t
116c0 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70  able keeps a cop
116d0 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a  y of all rows.**
116e0 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20   that have ever 
116f0 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e  been inserted in
11700 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75  to Queue and cau
11710 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74  ses duplicates t
11720 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65  o be.** discarde
11730 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61  d.  If the opera
11740 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c  tor is UNION ALL
11750 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65  , then duplicate
11760 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  s are allowed..*
11770 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  * .** If the que
11780 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20  ry has an ORDER 
11790 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73  BY, then entries
117a0 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61   in the Queue ta
117b0 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a  ble are kept in.
117c0 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65  ** ORDER BY orde
117d0 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  r and the first 
117e0 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74  entry is extract
117f0 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c  ed for each cycl
11800 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61  e.  Without.** a
11810 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20  n ORDER BY, the 
11820 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a  Queue table is j
11830 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a  ust a FIFO..**.*
11840 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61  * If a LIMIT cla
11850 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c  use is provided,
11860 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
11870 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20  ion stops after 
11880 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61  LIMIT rows.** ha
11890 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74  ve been output t
118a0 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49  o pDest.  A LIMI
118b0 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20  T of zero means 
118c0 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77  to output no row
118d0 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74  s and a.** negat
118e0 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20  ive LIMIT means 
118f0 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f  to output all ro
11900 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ws.  If there is
11910 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20   also an OFFSET 
11920 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61  clause.** with a
11930 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c   positive value,
11940 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
11950 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61  OFFSET outputs a
11960 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74  re discarded rat
11970 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e  her.** than bein
11980 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e  g sent to pDest.
11990 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e    The LIMIT coun
119a0 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  t does not begin
119b0 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46   until after OFF
119c0 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65  SET.** rows have
119d0 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a   been skipped..*
119e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
119f0 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
11a00 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73  iveQuery(.  Pars
11a10 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11a20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11a30 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
11a40 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11a50 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65  /* The recursive
11a60 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f   SELECT to be co
11a70 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
11a80 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
11a90 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
11aa0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
11ab0 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
11ac0 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b  *pSrc = p->pSrc;
11ad0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
11ae0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
11af0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
11b00 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  */.  int nCol = 
11b10 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
11b20 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
11b30 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
11b40 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a  ecursive table *
11b50 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
11b60 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
11b70 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65    /* The prepare
11b80 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
11b90 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
11ba0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74  /.  Select *pSet
11bb0 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20  up = p->pPrior; 
11bc0 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71    /* The setup q
11bd0 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64  uery */.  int ad
11be0 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  drTop;          
11bf0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
11c00 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  f the loop */.  
11c10 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64  int addrCont, ad
11c20 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a  drBreak;      /*
11c30 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52   CONTINUE and BR
11c40 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f  EAK addresses */
11c50 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20  .  int iCurrent 
11c60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
11c70 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20   /* The Current 
11c80 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  table */.  int r
11c90 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20  egCurrent;      
11ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
11cb0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72  ster holding Cur
11cc0 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  rent table */.  
11cd0 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20  int iQueue;     
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cf0 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   The Queue table
11d00 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69   */.  int iDisti
11d10 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nct = 0;        
11d20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
11d30 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20   unique results 
11d40 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e  if UNION */.  in
11d50 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69  t eDest = SRT_Fi
11d60 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48  fo;         /* H
11d70 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51  ow to write to Q
11d80 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ueue */.  Select
11d90 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20  Dest destQueue; 
11da0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63          /* Selec
11db0 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67  tDest targetting
11dc0 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
11dd0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11e00 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ter */.  int rc;
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
11e30 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c   code */.  ExprL
11e40 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
11e50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11e60 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
11e70 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
11e80 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20  t, *pOffset;    
11e90 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49     /* Saved LIMI
11ea0 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a  T and OFFSET */.
11eb0 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20    int regLimit, 
11ec0 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20  regOffset;      
11ed0 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65  /* Registers use
11ee0 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f  d by LIMIT and O
11ef0 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  FFSET */..  /* O
11f00 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74  btain authorizat
11f10 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75  ion to do a recu
11f20 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20  rsive query */. 
11f30 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
11f40 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
11f50 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20  LITE_RECURSIVE, 
11f60 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
11f70 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73  n;..  /* Process
11f80 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f   the LIMIT and O
11f90 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69  FFSET clauses, i
11fa0 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a  f they exist */.
11fb0 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71    addrBreak = sq
11fc0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
11fd0 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
11fe0 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f  ectRow = 320;  /
11ff0 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73  * 4 billion rows
12000 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
12010 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
12020 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b  se, p, addrBreak
12030 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d  );.  pLimit = p-
12040 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66 73  >pLimit;.  pOffs
12050 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
12060 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d  .  regLimit = p-
12070 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66  >iLimit;.  regOf
12080 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
12090 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  t;.  p->pLimit =
120a0 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
120b0 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  .  p->iLimit = p
120c0 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->iOffset = 0;. 
120d0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
120e0 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c  OrderBy;..  /* L
120f0 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  ocate the cursor
12100 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 43   number of the C
12110 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
12120 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59    for(i=0; ALWAY
12130 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b  S(i<pSrc->nSrc);
12140 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
12150 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73 52  Src->a[i].fg.isR
12160 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
12170 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
12180 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
12190 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
121a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
121b0 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e  locate cursors n
121c0 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75 65  umbers for Queue
121d0 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20   and Distinct.  
121e0 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  The cursor numbe
121f0 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44  r for.  ** the D
12200 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75  istinct table mu
12210 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e  st be exactly on
12220 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 51  e greater than Q
12230 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20  ueue in order.  
12240 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44  ** for the SRT_D
12250 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54 5f  istFifo and SRT_
12260 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e  DistQueue destin
12270 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20  ations to work. 
12280 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50  */.  iQueue = pP
12290 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
122a0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
122b0 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74  ION ){.    eDest
122c0 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52   = pOrderBy ? SR
122d0 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52  T_DistQueue : SR
122e0 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20 20  T_DistFifo;.    
122f0 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
12300 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
12310 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
12320 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
12330 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66 6f  Queue : SRT_Fifo
12340 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
12350 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
12360 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74 2c  estQueue, eDest,
12370 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20   iQueue);..  /* 
12380 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
12390 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51 75   for Current, Qu
123a0 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e 63  eue, and Distinc
123b0 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72 65  t. */.  regCurre
123c0 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  nt = ++pParse->n
123d0 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Mem;.  sqlite3Vd
123e0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
123f0 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72 72  penPseudo, iCurr
12400 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74 2c  ent, regCurrent,
12410 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70 4f   nCol);.  if( pO
12420 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65  rderBy ){.    Ke
12430 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
12440 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  = multiSelectOrd
12450 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61 72  erByKeyInfo(pPar
12460 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20 73  se, p, 1);.    s
12470 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
12480 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12490 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70 4f  eral, iQueue, pO
124a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c  rderBy->nExpr+2,
124b0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
124c0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
124d0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
124e0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73 74  YINFO);.    dest
124f0 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20 3d  Queue.pOrderBy =
12500 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65 6c   pOrderBy;.  }el
12510 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
12520 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12530 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
12540 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Queue, nCol);.  
12550 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  }.  VdbeComment(
12560 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c 65  (v, "Queue table
12570 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73 74  "));.  if( iDist
12580 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e 61  inct ){.    p->a
12590 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
125a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
125b0 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
125c0 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e 63  emeral, iDistinc
125d0 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73 65  t, 0);.    p->se
125e0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
125f0 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a  sEphemeral;.  }.
12600 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68 65  .  /* Detach the
12610 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
12620 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f 75   from the compou
12630 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 70  nd SELECT */.  p
12640 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
12650 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20  .  /* Store the 
12660 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
12670 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51 75  etup-query in Qu
12680 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75 70  eue. */.  pSetup
12690 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 72  ->pNext = 0;.  r
126a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
126b0 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
126c0 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
126d0 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d   pSetup->pNext =
126e0 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67   p;.  if( rc ) g
126f0 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72  oto end_of_recur
12700 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f  sive_query;..  /
12710 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20  * Find the next 
12720 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75 65  row in the Queue
12730 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74   and output that
12740 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f   row */.  addrTo
12750 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
12760 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
12770 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72  nd, iQueue, addr
12780 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
12790 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 54  rage(v);..  /* T
127a0 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78 74  ransfer the next
127b0 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f 76   row in Queue ov
127c0 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f  er to Current */
127d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
127e0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
127f0 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20 2f  ow, iCurrent); /
12800 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d  * To reset colum
12810 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66 28  n cache */.  if(
12820 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
12830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12840 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
12850 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
12860 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 43  y->nExpr+1, regC
12870 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65  urrent);.  }else
12880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12890 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
128a0 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72  wData, iQueue, r
128b0 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a  egCurrent);.  }.
128c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
128d0 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65  Op1(v, OP_Delete
128e0 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
128f0 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e 67   Output the sing
12900 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
12910 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20  t */.  addrCont 
12920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
12930 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64  eLabel(v);.  cod
12940 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f 66  eOffset(v, regOf
12950 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b  fset, addrCont);
12960 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  .  selectInnerLo
12970 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
12980 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65 6e  >pEList, iCurren
12990 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70  t,.      0, 0, p
129a0 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Dest, addrCont, 
129b0 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
129c0 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20  ( regLimit ){.  
129d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
129e0 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
129f0 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74  mpZero, regLimit
12a00 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
12a10 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
12a20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12a30 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12a40 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
12a50 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
12a60 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
12a70 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
12a80 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
12a90 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
12aa0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
12ab0 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
12ac0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
12ad0 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
12ae0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
12af0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
12b00 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ate ){.    sqlit
12b10 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
12b20 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67  e, "recursive ag
12b30 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
12b40 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b  not supported");
12b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
12b60 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
12b70 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
12b80 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
12b90 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
12ba0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
12bb0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
12bc0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
12bd0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
12be0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
12bf0 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
12c00 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
12c10 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
12c20 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
12c30 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
12c40 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
12c50 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
12c60 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
12c70 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
12c80 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
12c90 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
12ca0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
12cb0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
12cc0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70  = pLimit;.  p->p
12cd0 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
12ce0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
12cf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12d00 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46  MIT_CTE */../* F
12d10 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
12d20 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
12d30 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
12d40 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
12d50 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
12d60 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
12d70 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
12d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12d90 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
12da0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
12db0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
12dc0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
12dd0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
12de0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
12df0 2f 0a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  /.);../*.** Hand
12e00 6c 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  le the special c
12e10 61 73 65 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ase of a compoun
12e20 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f 72  d-select that or
12e30 69 67 69 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a  iginates from a.
12e40 2a 2a 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  ** VALUES clause
12e50 2e 20 20 42 79 20 68 61 6e 64 6c 69 6e 67 20 74  .  By handling t
12e60 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
12e70 20 63 61 73 65 2c 20 77 65 20 61 76 6f 69 64 20   case, we avoid 
12e80 64 65 65 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f  deep.** recursio
12e90 6e 2c 20 61 6e 64 20 74 68 75 73 20 64 6f 20 6e  n, and thus do n
12ea0 6f 74 20 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72  ot need to enfor
12eb0 63 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  ce the SQLITE_LI
12ec0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
12ed0 45 43 54 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55  ECT.** on a VALU
12ee0 45 53 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ES clause..**.**
12ef0 20 42 65 63 61 75 73 65 20 74 68 65 20 53 65 6c   Because the Sel
12f00 65 63 74 20 6f 62 6a 65 63 74 20 6f 72 69 67 69  ect object origi
12f10 6e 61 74 65 73 20 66 72 6f 6d 20 61 20 56 41 4c  nates from a VAL
12f20 55 45 53 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20  UES clause:.**  
12f30 20 28 31 29 20 49 74 20 68 61 73 20 6e 6f 20 4c   (1) It has no L
12f40 49 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 0a 2a  IMIT or OFFSET.*
12f50 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
12f60 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
12f70 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
12f80 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
12f90 61 75 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ause.*/.static i
12fa0 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61  nt multiSelectVa
12fb0 6c 75 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lues(.  Parse *p
12fc0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
12fd0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
12fe0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13000 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
13010 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
13020 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13030 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13040 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13050 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13060 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74 20   */.){.  Select 
13070 2a 70 50 72 69 6f 72 3b 0a 20 20 69 6e 74 20 6e  *pPrior;.  int n
13080 52 6f 77 20 3d 20 31 3b 0a 20 20 69 6e 74 20 72  Row = 1;.  int r
13090 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
130a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
130b0 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 3b 0a  F_MultiValue );.
130c0 20 20 64 6f 7b 0a 20 20 20 20 61 73 73 65 72 74    do{.    assert
130d0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
130e0 53 46 5f 56 61 6c 75 65 73 20 29 3b 0a 20 20 20  SF_Values );.   
130f0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
13100 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70 2d 3e 6f 70  TK_ALL || (p->op
13110 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 26 26 20 70  ==TK_SELECT && p
13120 2d 3e 70 50 72 69 6f 72 3d 3d 30 29 20 29 3b 0a  ->pPrior==0) );.
13130 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13140 4c 69 6d 69 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Limit==0 );.    
13150 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73  assert( p->pOffs
13160 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  et==0 );.    ass
13170 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
13180 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   || p->pEList->n
13190 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e  Expr==p->pNext->
131a0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
131b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69  .    if( p->pPri
131c0 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or==0 ) break;. 
131d0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50     assert( p->pP
131e0 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29  rior->pNext==p )
131f0 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  ;.    p = p->pPr
13200 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b  ior;.    nRow++;
13210 0a 20 20 7d 77 68 69 6c 65 28 31 29 3b 0a 20 20  .  }while(1);.  
13220 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
13230 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
13240 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f  or;.    p->pPrio
13250 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
13260 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
13270 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
13280 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
13290 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69 66 28   pPrior;.    if(
132a0 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20   rc ) break;.   
132b0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
132c0 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70   nRow;.    p = p
132d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  ->pNext;.  }.  r
132e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
132f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13300 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f  is called to pro
13310 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  cess a compound 
13320 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a  query form from.
13330 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73  ** two or more s
13340 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20  eparate queries 
13350 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49  using UNION, UNI
13360 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20  ON ALL, EXCEPT, 
13370 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a  or.** INTERSECT.
13380 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73  **.** "p" points
13390 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
133a0 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75  st of the two qu
133b0 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72  eries.  the quer
133c0 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74  y on the.** left
133d0 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20   is p->pPrior.  
133e0 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63  The left query c
133f0 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63  ould also be a c
13400 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a  ompound query.**
13410 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
13420 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
13430 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72   be called recur
13440 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54  sively. .**.** T
13450 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
13460 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72  e total query ar
13470 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  e to be written 
13480 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69  into a destinati
13490 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44  on.** of type eD
134a0 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74  est with paramet
134b0 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20  er iParm..**.** 
134c0 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73  Example 1:  Cons
134d0 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79  ider a three-way
134e0 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74   compound SQL st
134f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
13500 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
13510 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t1 UNION SELECT
13520 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e   b FROM t2 UNION
13530 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
13540 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61  3.**.** This sta
13550 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
13560 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   up as follows:.
13570 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
13580 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20   c FROM t3.**   
13590 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d     |.**      `--
135a0 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46  --->  SELECT b F
135b0 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20  ROM t2.**       
135c0 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d               `--
135e0 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20  ---->  SELECT a 
135f0 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68  FROM t1.**.** Th
13600 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20  e arrows in the 
13610 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65  diagram above re
13620 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65  present the Sele
13630 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65  ct.pPrior pointe
13640 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73  r..** So if this
13650 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13660 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20  ed with p equal 
13670 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c  to the t3 query,
13680 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20   then.** pPrior 
13690 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71  will be the t2 q
136a0 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c  uery.  p->op wil
136b0 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e  l be TK_UNION in
136c0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
136d0 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65  * Notice that be
136e0 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
136f0 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63   SQLite parses c
13700 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c  ompound SELECTs,
13710 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
13720 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79  al selects alway
13730 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66  s group from lef
13740 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73  t to right..*/.s
13750 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
13760 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a  elect(.  Parse *
13770 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
13780 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
13790 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
137a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
137b0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
137c0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
137d0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
137e0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
137f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
13800 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
13810 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
13820 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13830 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20  /* Success code 
13840 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e  from a subroutin
13850 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
13860 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20  Prior;       /* 
13870 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69  Another SELECT i
13880 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75  mmediately to ou
13890 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65  r left */.  Vdbe
138a0 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
138b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
138c0 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20  de to this VDBE 
138d0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
138e0 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c  dest;      /* Al
138f0 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64  ternative data d
13900 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
13910 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20  Select *pDelete 
13920 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f  = 0;  /* Chain o
13930 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73  f simple selects
13940 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
13950 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
13960 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
13970 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
13980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13990 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
139a0 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20 20 20  t iSub1 = 0;    
139b0 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
139c0 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
139d0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 20   */.  int iSub2 
139e0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
139f0 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
13a00 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
13a10 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
13a20 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ure there is no 
13a30 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
13a40 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f  T clause on prio
13a50 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79  r SELECTs.  Only
13a60 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28  .  ** the last (
13a70 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45  right-most) SELE
13a80 43 54 20 69 6e 20 74 68 65 20 73 65 72 69 65 73  CT in the series
13a90 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44   may have an ORD
13aa0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a  ER BY or LIMIT..
13ab0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
13ac0 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b   && p->pPrior );
13ad0 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e    /* Calling fun
13ae0 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73  ction guarantees
13af0 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20   this much */.  
13b00 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
13b10 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
13b20 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70  ive)==0 || p->op
13b30 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f  ==TK_ALL || p->o
13b40 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
13b50 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
13b60 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ;.  pPrior = p->
13b70 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d  pPrior;.  dest =
13b80 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70   *pDest;.  if( p
13b90 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
13ba0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13bb0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f  rorMsg(pParse,"O
13bc0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
13bd0 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72  hould come after
13be0 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c   %s not before",
13bf0 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e  .      selectOpN
13c00 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20  ame(p->op));.   
13c10 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74   rc = 1;.    got
13c20 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13c30 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  nd;.  }.  if( pP
13c40 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
13c50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13c60 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49  Msg(pParse,"LIMI
13c70 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  T clause should 
13c80 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
13c90 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
13ca0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
13cb0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
13cc0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
13cd0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
13ce0 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
13cf0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
13d00 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
13d10 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
13d20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
13d30 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
13d40 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
13d50 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
13d60 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
13d70 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
13d80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
13d90 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
13da0 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
13db0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
13dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13dd0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
13de0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
13df0 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
13e00 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
13e10 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
13e20 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
13e30 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c  /* Special handl
13e40 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ing for a compou
13e50 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
13e60 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56  riginates as a V
13e70 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20  ALUES clause..  
13e80 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
13e90 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
13ea0 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  alue ){.    rc =
13eb0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
13ec0 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
13ed0 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
13ee0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
13ef0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13f00 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
13f10 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
13f20 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
13f30 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
13f40 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
13f50 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
13f60 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
13f70 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
13f80 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73  ->pEList );.  as
13f90 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
13fa0 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e  >nExpr==pPrior->
13fb0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
13fc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13fd0 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
13fe0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13ff0 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
14000 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
14010 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
14020 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
14030 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
14040 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
14050 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
14060 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
14070 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
14080 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
14090 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
140a0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
140b0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
140c0 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
140d0 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
140e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
140f0 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20 61  e for the left a
14100 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54 20  nd right SELECT 
14110 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
14120 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70  .  switch( p->op
14130 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
14140 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ALL: {.      int
14150 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20   addr = 0;.     
14160 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20   int nLimit;.   
14170 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72 69     assert( !pPri
14180 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20 20  or->pLimit );.  
14190 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d      pPrior->iLim
141a0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
141b0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4f        pPrior->iO
141c0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
141d0 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  et;.      pPrior
141e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c  ->pLimit = p->pL
141f0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
14200 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 2d  or->pOffset = p-
14210 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14220 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14230 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14240 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14250 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14260 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14270 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
14280 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
14290 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
142a0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
142b0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
142c0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
142d0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
142e0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72    }.      p->pPr
142f0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
14300 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69 6f  ->iLimit = pPrio
14310 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20  r->iLimit;.     
14320 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 50   p->iOffset = pP
14330 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  rior->iOffset;. 
14340 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d       if( p->iLim
14350 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  it ){.        ad
14360 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14370 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
14380 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 20  ot, p->iLimit); 
14390 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
143a0 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
143b0 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61  ment((v, "Jump a
143c0 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65  head if LIMIT re
143d0 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ached"));.      
143e0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
143f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
14400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14410 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
14420 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14440 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69 4f 66  ->iLimit, p->iOf
14450 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66 66 73  fset+1, p->iOffs
14460 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
14470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70       }.      exp
14480 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
14490 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
144a0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
144b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
144c0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
144d0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
144e0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
144f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
14500 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
14510 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
14520 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
14530 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
14540 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
14550 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63  EstAdd(p->nSelec
14560 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53  tRow, pPrior->nS
14570 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20  electRow);.     
14580 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69   if( pPrior->pLi
14590 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73 71  mit.       && sq
145a0 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
145b0 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  er(pPrior->pLimi
145c0 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20  t, &nLimit).    
145d0 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20 26     && nLimit>0 &
145e0 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  & p->nSelectRow 
145f0 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  > sqlite3LogEst(
14600 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20 20  (u64)nLimit) .  
14610 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
14620 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
14630 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
14640 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
14650 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
14660 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
14670 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
14680 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
14690 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
146a0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
146b0 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
146c0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
146d0 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
146e0 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
146f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
14700 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
14710 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
14720 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
14730 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
14740 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
14750 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
14760 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
14770 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
14780 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
14790 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
147a0 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
147b0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
147c0 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
147d0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
147e0 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
147f0 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
14800 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
14810 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
14820 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
14830 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
14840 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
14850 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14860 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
14870 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
14880 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
14890 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
148a0 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a  est==priorOp ){.
148b0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61          /* We ca
148c0 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72  n reuse a tempor
148d0 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61  ary table genera
148e0 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20  ted by a SELECT 
148f0 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a  to our.        *
14900 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
14910 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
14920 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  rt( p->pLimit==0
14930 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20   );      /* Not 
14940 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
14950 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
14960 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14970 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b  p->pOffset==0 );
14980 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f       /* Not allo
14990 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20  wed on leftward 
149a0 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  elements */.    
149b0 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64      unionTab = d
149c0 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20  est.iSDParm;.   
149d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
149e0 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65    /* We will nee
149f0 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20  d to create our 
14a00 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  own temporary ta
14a10 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ble to hold the.
14a20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
14a30 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
14a40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
14a50 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70      unionTab = p
14a60 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14a70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
14a80 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
14a90 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
14aa0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14ab0 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
14ac0 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c  meral, unionTab,
14ad0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   0);.        ass
14ae0 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e  ert( p->addrOpen
14af0 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b  Ephm[0] == -1 );
14b00 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72  .        p->addr
14b10 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64  OpenEphm[0] = ad
14b20 64 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64  dr;.        find
14b30 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
14b40 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
14b50 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
14b60 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
14b70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d  EList );.      }
14b80 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
14b90 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
14ba0 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66  ments to our lef
14bb0 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
14bc0 20 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72   assert( !pPrior
14bd0 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
14be0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
14bf0 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e  tDestInit(&union
14c00 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75  dest, priorOp, u
14c10 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20  nionTab);.      
14c20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14c30 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14c40 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14c50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14c60 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
14c70 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e  , pPrior, &union
14c80 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  dest);.      if(
14c90 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67   rc ){.        g
14ca0 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
14cb0 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _end;.      }.. 
14cc0 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
14cd0 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20   current SELECT 
14ce0 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20  statement.      
14cf0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
14d00 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b  op==TK_EXCEPT ){
14d10 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
14d20 54 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20  T_Except;.      
14d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
14d40 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
14d50 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
14d60 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e    op = SRT_Union
14d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14d80 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
14d90 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
14da0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
14db0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
14dc0 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
14dd0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
14de0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
14df0 20 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e        uniondest.
14e00 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20  eDest = op;.    
14e10 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
14e20 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
14e30 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
14e40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14e50 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
14e60 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73  se, p, &uniondes
14e70 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  t);.      testca
14e80 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
14e90 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75  K );.      /* Qu
14ea0 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
14eb0 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
14ec0 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
14ed0 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
14ee0 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20    ** Be sure to 
14ef0 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72  delete p->pOrder
14f00 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74  By, therefore, t
14f10 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79  o avoid a memory
14f20 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   leak. */.      
14f30 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
14f40 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
14f50 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44  derBy);.      pD
14f60 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f  elete = p->pPrio
14f70 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  r;.      p->pPri
14f80 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
14f90 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
14fa0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
14fb0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
14fc0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  .        p->nSel
14fd0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
14fe0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
14ff0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
15000 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
15010 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
15020 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
15030 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
15040 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
15050 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
15060 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
15070 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69  et;.      p->iLi
15080 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  mit = 0;.      p
15090 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->iOffset = 0;..
150a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
150b0 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
150c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
150d0 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
150e0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  orm.      ** it 
150f0 69 73 20 74 68 61 74 20 77 65 20 63 75 72 72 65  is that we curre
15100 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20  ntly need..     
15110 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
15120 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74  ( unionTab==dest
15130 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74  .iSDParm || dest
15140 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
15150 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  );.      if( des
15160 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70  t.eDest!=priorOp
15170 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
15180 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
15190 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61  Start;.        a
151a0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
151b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
151c0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
151d0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
151e0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
151f0 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
15200 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
15210 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
15220 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
15230 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e  r;.          gen
15240 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
15250 28 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d  (pParse, pFirst-
15260 3e 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70  >pSrc, pFirst->p
15270 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
15280 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
15290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
152a0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
152b0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
152c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
152d0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
152e0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
152f0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
15300 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
15310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15320 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
15330 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
15340 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15350 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
15360 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
15370 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
15380 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e         selectInn
15390 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
153a0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69  , p->pEList, uni
153b0 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20  onTab,.         
153c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
153d0 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e  , 0, &dest, iCon
153e0 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  t, iBreak);.    
153f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
15400 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
15410 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  Cont);.        s
15420 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15430 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75 6e 69  (v, OP_Next, uni
15440 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29 3b 20  onTab, iStart); 
15450 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15470 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15480 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
15490 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
154a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
154b0 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
154c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
154d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
154e0 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72 74   default: assert
154f0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  ( p->op==TK_INTE
15500 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20 20  RSECT ); {.     
15510 20 69 6e 74 20 74 61 62 31 2c 20 74 61 62 32 3b   int tab1, tab2;
15520 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74  .      int iCont
15530 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
15540 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  ;.      Expr *pL
15550 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 0a  imit, *pOffset;.
15560 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
15570 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
15580 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b 0a   intersectdest;.
15590 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 0a 20        int r1;.. 
155a0 20 20 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43       /* INTERSEC
155b0 54 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  T is different f
155c0 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73  rom the others s
155d0 69 6e 63 65 20 69 74 20 72 65 71 75 69 72 65 73  ince it requires
155e0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65  .      ** two te
155f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
15600 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
15610 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
15620 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 61  in.      ** by a
15630 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20 74 61  llocating the ta
15640 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  bles we will nee
15650 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
15660 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d    tab1 = pParse-
15670 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 74  >nTab++;.      t
15680 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
15690 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ab++;.      asse
156a0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
156b0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 61 64 64  =0 );..      add
156c0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
156d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
156e0 45 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c  Ephemeral, tab1,
156f0 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
15700 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
15710 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
15720 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
15730 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
15740 20 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d        findRightm
15750 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73  ost(p)->selFlags
15760 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
15770 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
15780 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
15790 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
157a0 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
157b0 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
157c0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
157d0 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
157e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
157f0 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
15800 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
15810 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
15820 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
15830 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
15840 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
15850 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15860 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
15870 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
15880 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
15890 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
158a0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
158b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
158c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
158d0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
158e0 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
158f0 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
15900 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
15910 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
15920 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15930 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
15940 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
15950 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
15960 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
15970 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
15980 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
15990 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
159a0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
159b0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
159c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
159d0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
159e0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
159f0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
15a00 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
15a10 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
15a20 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
15a30 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
15a40 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
15a50 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
15a60 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
15a70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
15a80 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
15a90 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
15aa0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
15ab0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
15ac0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
15ad0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
15ae0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
15af0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
15b00 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
15b10 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
15b20 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
15b30 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
15b40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15b50 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
15b60 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
15b70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
15b80 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
15b90 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
15ba0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
15bb0 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
15bc0 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
15bd0 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
15be0 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
15bf0 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
15c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
15c10 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
15c20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
15c30 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
15c40 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
15c50 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
15c60 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
15c70 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
15c80 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
15c90 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
15ca0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
15cb0 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e 70  Parse, pFirst->p
15cc0 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  Src, pFirst->pEL
15cd0 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
15ce0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
15cf0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
15d00 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
15d10 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
15d20 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
15d30 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
15d40 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
15d50 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
15d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d70 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
15d80 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
15d90 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15da0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
15db0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
15dc0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
15dd0 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56  Start = sqlite3V
15de0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15df0 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20 72  RowData, tab1, r
15e00 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
15e10 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
15e20 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74  , OP_NotFound, t
15e30 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20  ab2, iCont, r1, 
15e40 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  0); VdbeCoverage
15e50 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
15e60 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15e70 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
15e80 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c      selectInnerL
15e90 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
15ea0 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a  ->pEList, tab1,.
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
15ed0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
15ee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15ef0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15f00 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
15f10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15f20 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15f30 74 61 62 31 2c 20 69 53 74 61 72 74 29 3b 20 56  tab1, iStart); V
15f40 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
15f60 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15f70 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
15f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15f90 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74  2(v, OP_Close, t
15fa0 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ab2, 0);.      s
15fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15fc0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
15fd0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  b1, 0);.      br
15fe0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
15ff0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
16000 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
16010 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
16020 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a  p->op!=TK_ALL);.
16030 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
16040 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16050 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
16060 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
16070 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
16080 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
16090 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
160a0 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
160b0 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
160c0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
160d0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
160e0 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
160f0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
16100 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
16110 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
16120 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16130 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
16140 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
16150 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
16160 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
16170 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
16180 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
16190 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
161a0 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
161b0 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
161c0 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
161d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
161e0 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
161f0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
16200 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16220 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
16230 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
16240 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
16250 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
16260 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
16270 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
16280 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
16290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
162a0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
162b0 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
162c0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
162d0 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
162e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
162f0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
16300 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
16310 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
16320 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16340 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
16350 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
16360 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
16370 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  p->pNext==0 );. 
16380 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
16390 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
163a0 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
163b0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
163c0 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  b, nCol, 1);.   
163d0 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
163e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
163f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
16400 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
16410 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
16420 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
16430 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
16440 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
16450 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
16460 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
16470 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
16480 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
16490 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
164a0 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
164b0 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
164c0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
164d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
164e0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
164f0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
16500 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
16510 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
16520 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
16530 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
16540 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
16550 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
16560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
16570 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
16580 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
16590 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
165a0 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
165b0 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
165c0 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
165d0 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
165e0 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
165f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
16600 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
16610 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
16620 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16640 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16650 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
16660 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
16670 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
16680 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
16690 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
166a0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
166b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
166d0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
166e0 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
166f0 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
16700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16710 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
16720 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
16730 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
16740 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
16750 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
16760 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
16770 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
16780 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
16790 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
167a0 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
167b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
167c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
167d0 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
167e0 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  .** Error messag
167f0 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f  e for when two o
16800 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  r more terms of 
16810 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
16820 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  t have different
16830 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20  .** size result 
16840 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sets..*/.void sq
16850 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
16860 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61  NumTermsError(Pa
16870 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
16880 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
16890 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
168a0 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71  Values ){.    sq
168b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
168c0 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
168d0 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
168e0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
168f0 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  erms");.  }else{
16900 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
16910 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
16920 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
16930 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
16940 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
16950 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
16960 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
16970 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
16980 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
16990 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
169a0 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
169b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
169c0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
169d0 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
169e0 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
169f0 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
16a00 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
16a10 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
16a20 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
16a30 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
16a40 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
16a50 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
16a60 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
16a70 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
16a80 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
16a90 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
16aa0 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
16ab0 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
16ac0 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
16ad0 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
16ae0 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
16af0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
16b00 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
16b10 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
16b20 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
16b30 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
16b40 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
16b50 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
16b60 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
16b70 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
16b80 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
16b90 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
16ba0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
16bb0 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
16bc0 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
16bd0 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
16be0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
16bf0 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
16c00 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
16c10 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
16c20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
16c30 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
16c40 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
16c50 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
16c60 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
16c70 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
16c90 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
16ca0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
16cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16cc0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16cd0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
16ce0 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
16cf0 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
16d00 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
16d10 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
16d20 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
16d30 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
16d40 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
16d50 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
16d60 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
16d70 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
16d80 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
16d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
16da0 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
16db0 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
16dc0 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
16dd0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16de0 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
16df0 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
16e00 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
16e10 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
16e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
16e30 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
16e40 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
16e50 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
16e60 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
16e70 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
16e80 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
16e90 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
16ea0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
16eb0 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
16ec0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
16ed0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
16ee0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
16ef0 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
16f00 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
16f10 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
16f20 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
16f30 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
16f40 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
16f50 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16f60 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
16f70 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16f80 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  v);.    addr2 = 
16f90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fa0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
16fb0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
16fc0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
16fd0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
17000 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
17010 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
17020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17030 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
17040 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43  ump, addr2+2, iC
17050 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32  ontinue, addr2+2
17060 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
17070 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
17080 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17090 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
170a0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
170b0 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
170c0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
170d0 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
170e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
170f0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
17100 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
17110 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
17120 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
17130 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
17140 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
17150 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
17160 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
17170 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
17180 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
17190 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
171a0 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
171b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  ;..  assert( pDe
171c0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45  st->eDest!=SRT_E
171d0 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72  xists );.  asser
171e0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
171f0 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
17200 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
17210 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
17220 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
17230 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
17240 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
17250 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17260 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
17270 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
17280 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
17290 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
172a0 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
172b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
172c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
172d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
172e0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
172f0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
17300 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
17310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17320 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
17330 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
17340 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
17350 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
17360 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
17370 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
17380 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17390 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
173a0 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
173b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
173c0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
173d0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
173e0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
173f0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
17400 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17410 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
17420 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
17430 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
17440 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
17450 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
17460 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
17470 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17480 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
17490 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
174a0 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
174b0 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20  nSdst>1 );.     
174c0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
174d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
174e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
174f0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
17500 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
17510 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
17520 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 31  t, .          r1
17530 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
17540 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
17550 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17560 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
17570 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
17580 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
17590 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
175a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
175b0 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
175c0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
175d0 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175f0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
17600 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
17610 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
17620 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
17630 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
17640 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
17650 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
17660 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
17670 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
17680 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
17690 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
176a0 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
176b0 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
176c0 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
176d0 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
176e0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
176f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
17700 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
17710 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
17720 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =1 || pParse->nE
17730 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73  rr>0 );  testcas
17740 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31  e( pIn->nSdst!=1
17750 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17760 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
17770 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
17780 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
17790 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
177a0 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
177b0 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
177c0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
177d0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
177e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
177f0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
17800 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
17810 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
17820 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
17830 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
17840 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
17850 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
17860 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
17870 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
17880 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
17890 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
178a0 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
178b0 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
178c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
178d0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
178e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
178f0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
17900 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
17910 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
17920 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
17930 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
17940 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
17950 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
17960 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49  pDest->iSdst, pI
17970 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
17980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17990 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
179a0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
179b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
179c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
179d0 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
179e0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
179f0 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
17a00 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
17a10 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
17a20 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
17a30 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
17a40 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
17a50 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
17a60 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
17a70 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
17a80 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
17a90 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
17aa0 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
17ab0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
17ac0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
17ad0 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
17ae0 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
17af0 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
17b00 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
17b10 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
17b20 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
17b30 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
17b40 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
17b50 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
17b60 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
17b70 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
17b80 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
17b90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17ba0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
17bb0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
17bc0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
17bd0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
17be0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
17bf0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
17c00 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
17c10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
17c30 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
17c40 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
17c50 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
17c60 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
17c70 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
17c80 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17c90 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
17ca0 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
17cb0 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
17cc0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
17cd0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
17ce0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
17cf0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
17d00 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17d10 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
17d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d30 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
17d40 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
17d50 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
17d60 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
17d70 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
17d80 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
17d90 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
17da0 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
17db0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
17dc0 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
17dd0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
17de0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
17df0 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
17e00 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
17e10 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
17e20 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
17e30 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
17e40 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
17e50 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
17e60 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
17e70 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
17e80 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
17e90 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
17ea0 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
17eb0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
17ec0 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
17ed0 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
17ee0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
17ef0 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
17f00 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
17f10 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
17f20 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
17f30 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
17f40 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
17f50 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
17f60 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
17f70 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
17f80 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
17f90 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
17fa0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
17fb0 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
17fc0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
17fe0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
17ff0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
18000 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
18010 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
18020 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
18030 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
18050 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
18060 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
18070 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
18080 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
18090 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
180a0 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
180b0 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
180c0 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
180d0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
180e0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
180f0 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
18100 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
18110 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
18120 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
18130 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
18140 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
18150 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
18160 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
18170 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
18180 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
18190 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
181a0 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
181b0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
181c0 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
181d0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
181e0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
181f0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
18200 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
18210 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
18220 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
18230 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
18240 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
18250 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
18260 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
18270 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
18280 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
18290 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
182a0 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
182b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
182c0 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
182d0 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
182e0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
182f0 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
18300 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
18310 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
18320 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
18330 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
18340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
18350 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
18360 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
18370 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
18380 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
18390 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
183a0 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
183b0 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
183c0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
183d0 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
183e0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
183f0 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
18400 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
18410 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
18420 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
18430 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
18440 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
18450 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
18460 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
18470 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
18480 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
18490 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
184a0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
184b0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
184c0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
184d0 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
184e0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
184f0 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
18500 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
18510 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
18520 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
18530 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
18540 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
18550 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
18560 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
18570 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
18580 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
18590 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
185a0 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
185b0 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
185c0 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
185d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
185e0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
185f0 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
18600 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
18610 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
18620 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
18630 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
18640 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
18650 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
18660 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
18670 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
18680 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
18690 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
186a0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
186b0 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
186c0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
186d0 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
186e0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
186f0 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
18700 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
18710 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
18720 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
18730 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
18740 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
18750 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
18760 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
18770 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
18780 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
18790 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
187a0 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
187b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
187c0 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
187d0 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
187e0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
187f0 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
18800 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
18810 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
18820 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
18830 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
18840 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
18850 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
18860 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
18870 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
18880 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
18890 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
188a0 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
188b0 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
188c0 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
188d0 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
188e0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
188f0 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
18900 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
18910 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
18920 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
18930 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
18940 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
18950 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
18960 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
18970 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
18980 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
18990 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
189a0 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
189b0 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
189c0 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
189d0 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
189e0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
189f0 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
18a00 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
18a10 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
18a20 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
18a30 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
18a40 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
18a50 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
18a60 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
18a70 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
18a80 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
18a90 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
18aa0 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
18ab0 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
18ac0 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
18ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
18ae0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
18af0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
18b00 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
18b10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
18b20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
18b30 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
18b40 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
18b50 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
18b60 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
18b70 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
18b80 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
18b90 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
18ba0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
18bb0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
18bc0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
18bd0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
18be0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
18bf0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
18c00 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
18c10 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
18c20 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
18c30 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
18c40 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
18c50 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
18c60 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
18c70 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
18c80 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
18c90 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
18ca0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
18cb0 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
18cc0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
18cd0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
18ce0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
18cf0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
18d00 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
18d10 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
18d20 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
18d30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18d40 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
18d50 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
18d60 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18d70 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
18d80 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18d90 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
18da0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
18db0 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
18dc0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
18dd0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
18de0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
18df0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
18e00 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
18e10 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
18e20 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
18e30 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
18e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
18e50 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
18e60 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
18e70 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
18e80 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
18e90 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
18ea0 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
18eb0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
18ec0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
18ed0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
18ee0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
18ef0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
18f00 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
18f10 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
18f20 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
18f30 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
18f40 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
18f50 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
18f60 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
18f70 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
18f80 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
18f90 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
18fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
18fb0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
18fc0 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
18fd0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
18fe0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
18ff0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
19000 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
19010 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
19020 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
19030 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
19040 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
19050 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
19060 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
19070 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
19080 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
19090 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
190a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
190b0 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
190c0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
190d0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
190e0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
190f0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
19100 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
19110 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
19120 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
19130 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
19140 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
19150 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
19160 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
19170 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
19180 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
19190 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
191a0 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
191b0 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
191c0 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
191d0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
191e0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
191f0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
19200 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
19210 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
19220 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
19230 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
19240 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
19250 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
19260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
19270 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
19280 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
19290 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
192a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
192b0 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
192c0 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
192d0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
192e0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
192f0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
19300 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
19310 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
19320 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
19330 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
19340 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
19350 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
19360 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
19370 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
19380 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
19390 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
193a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
193b0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
193c0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
193d0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
193e0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
193f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19400 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
19410 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
19420 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
19430 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
19440 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
19450 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
19460 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
19470 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19480 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
19490 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
194a0 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
194b0 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
194c0 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
194d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
194e0 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
194f0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
19500 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
19510 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
19520 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
19530 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
19540 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
19550 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
19560 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
19570 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
19580 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
19590 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
195a0 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
195b0 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
195c0 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
195d0 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
195e0 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
195f0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19600 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
19610 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19620 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
19630 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
19640 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
19650 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
19660 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
19670 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
19680 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
19690 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
196a0 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
196b0 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
196c0 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
196d0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
196e0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
196f0 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
19700 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
19710 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
19720 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
19730 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
19740 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
19750 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
19760 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
19770 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
19780 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
19790 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
197a0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
197b0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
197c0 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
197d0 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
197e0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
197f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
19800 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19810 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
19820 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
19830 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
19840 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
19850 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
19860 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
19870 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
19880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19890 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
198a0 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
198b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
198c0 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
198d0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
198e0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
198f0 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
19900 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
19910 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
19920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19930 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
19940 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
19950 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
19960 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
19970 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  ue = i;.        
19980 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
19990 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
199a0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
199b0 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
199c0 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   pNew);.        
199d0 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70  if( pOrderBy ) p
199e0 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65  OrderBy->a[nOrde
199f0 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65  rBy++].u.x.iOrde
19a00 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b  rByCol = (u16)i;
19a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19a20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
19a30 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
19a40 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20  permutation and 
19a50 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73 20  keyinfo that is 
19a60 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  used with.  ** t
19a70 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 75  he permutation u
19a80 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
19a90 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20 2a   if the next.  *
19aa0 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 73  * row of results
19ab0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65   comes from sele
19ac0 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e 20  ctA or selectB. 
19ad0 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69 63   Also add explic
19ae0 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f  it.  ** collatio
19af0 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  ns to the ORDER 
19b00 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  BY clause terms 
19b10 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
19b20 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a 2a   subqueries.  **
19b30 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61 6e   to the right an
19b40 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20 65  d the left are e
19b50 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20 75  valuated, they u
19b60 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20  se the correct. 
19b70 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20   ** collation.. 
19b80 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20 3d   */.  aPermute =
19b90 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
19ba0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66  RawNN(db, sizeof
19bb0 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79 20  (int)*(nOrderBy 
19bc0 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50 65  + 1));.  if( aPe
19bd0 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72  rmute ){.    str
19be0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
19bf0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61 50  m *pItem;.    aP
19c00 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72 64  ermute[0] = nOrd
19c10 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69 3d  erBy;.    for(i=
19c20 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  1, pItem=pOrderB
19c30 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72 42  y->a; i<=nOrderB
19c40 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  y; i++, pItem++)
19c50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
19c60 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
19c70 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  rByCol>0 );.    
19c80 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
19c90 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19ca0 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <=p->pEList->nEx
19cb0 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72  pr );.      aPer
19cc0 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  mute[i] = pItem-
19cd0 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
19ce0 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 1;.    }.    
19cf0 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74  pKeyMerge = mult
19d00 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
19d10 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
19d20 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
19d30 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
19d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
19d50 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
19d60 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
19d70 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
19d80 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
19d90 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
19da0 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
19db0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
19dc0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
19dd0 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
19de0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
19df0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
19e00 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
19e10 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
19e20 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
19e30 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
19e40 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
19e50 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
19e60 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
19e70 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
19e80 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
19e90 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
19ea0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
19eb0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
19ec0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
19ed0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
19ee0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
19ef0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
19f00 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
19f10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19f20 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
19f30 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
19f40 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
19f50 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
19f60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19f70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
19f80 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
19f90 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
19fa0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
19fb0 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
19fc0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
19fd0 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
19fe0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
19ff0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
1a000 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
1a010 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
1a020 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1a030 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
1a040 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
1a050 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
1a060 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
1a070 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
1a080 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
1a090 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
1a0a0 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
1a0b0 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
1a0c0 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
1a0d0 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
1a0e0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1a0f0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1a100 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  = 0;.  sqlite3Re
1a110 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
1a120 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  y(pParse, p, p->
1a130 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1a140 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  ");.  if( pPrior
1a150 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20  ->pPrior==0 ){. 
1a160 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
1a170 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
1a180 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50  arse, pPrior, pP
1a190 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rior->pOrderBy, 
1a1a0 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20  "ORDER");.  }.. 
1a1b0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1a1c0 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20  limit registers 
1a1d0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
1a1e0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
1a1f0 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  e, p, labelEnd);
1a200 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
1a210 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29   && op==TK_ALL )
1a220 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20  {.    regLimitA 
1a230 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a240 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20  ;.    regLimitB 
1a250 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1a260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1a270 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
1a280 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f  py, p->iOffset ?
1a290 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20   p->iOffset+1 : 
1a2a0 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20  p->iLimit,.     
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1a2d0 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c  LimitA);.    sql
1a2e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a2f0 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69  , OP_Copy, regLi
1a300 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29  mitA, regLimitB)
1a310 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1a320 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69  egLimitA = regLi
1a330 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  mitB = 0;.  }.  
1a340 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1a350 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
1a360 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
1a370 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
1a380 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
1a390 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66  ffset);.  p->pOf
1a3a0 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67  fset = 0;..  reg
1a3b0 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65  AddrA = ++pParse
1a3c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64  ->nMem;.  regAdd
1a3d0 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rB = ++pParse->n
1a3e0 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
1a3f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a400 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
1a410 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
1a420 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1a430 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
1a440 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
1a450 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
1a460 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
1a470 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
1a480 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
1a490 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a4a0 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65  a coroutine to e
1a4b0 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45  valuate the SELE
1a4c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
1a4d0 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66  the.  ** left of
1a4e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70   the compound op
1a4f0 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22  erator - the "A"
1a500 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1a510 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71  addrSelectA = sq
1a520 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1a530 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61  Addr(v) + 1;.  a
1a540 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
1a550 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
1a560 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
1a570 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
1a580 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
1a590 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
1a5a0 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
1a5b0 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
1a5c0 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c  egLimitA;.  expl
1a5d0 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
1a5e0 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
1a5f0 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
1a600 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1a610 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
1a620 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
1a630 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1a640 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
1a650 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1a660 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
1a670 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1a680 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1a690 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1a6a0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
1a6b0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
1a6c0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
1a6d0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1a6e0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1a6f0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1a700 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1a710 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1a720 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1a730 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
1a740 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
1a750 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1a760 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
1a770 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
1a780 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
1a790 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
1a7a0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
1a7b0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
1a7c0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1a7d0 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
1a7e0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
1a7f0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
1a800 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
1a810 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
1a820 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
1a830 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
1a840 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
1a850 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
1a860 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
1a870 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20  EndCoroutine(v, 
1a880 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
1a890 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1a8a0 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1a8b0 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
1a8c0 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
1a8d0 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
1a8e0 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
1a8f0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
1a900 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
1a910 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
1a920 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
1a930 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
1a940 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
1a950 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
1a960 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
1a970 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
1a980 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
1a990 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
1a9a0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
1a9b0 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
1a9c0 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
1a9d0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1a9e0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
1a9f0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1aa00 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
1aa10 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
1aa20 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
1aa30 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
1aa40 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
1aa50 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
1aa60 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
1aa70 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1aa80 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
1aa90 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
1aaa0 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
1aab0 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
1aac0 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aae0 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
1aaf0 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
1ab10 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
1ab20 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
1ab30 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
1ab40 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
1ab50 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
1ab60 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
1ab70 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
1ab80 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
1ab90 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
1aba0 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
1abb0 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
1abc0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
1abd0 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
1abe0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
1abf0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
1ac00 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41  A_noB = addrEofA
1ac10 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d   = labelEnd;.  }
1ac20 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
1ac30 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
1ac40 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
1ac50 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
1ac60 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
1ac70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
1ac80 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
1ac90 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72  rOutB);.    addr
1aca0 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74  EofA_noB = sqlit
1acb0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1acc0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1acd0 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  rB, labelEnd);. 
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1ad10 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1ad20 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
1ad30 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
1ad40 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74  electRow = sqlit
1ad50 65 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e  e3LogEstAdd(p->n
1ad60 53 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f  SelectRow, pPrio
1ad70 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a  r->nSelectRow);.
1ad80 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1ad90 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1ada0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1adb0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1adc0 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
1add0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1ade0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1adf0 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
1ae00 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
1ae10 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
1ae20 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
1ae30 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
1ae40 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
1ae50 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
1ae60 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
1ae70 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1ae80 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
1ae90 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
1aea0 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
1aeb0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1aec0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
1aed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1aee0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1aef0 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
1af00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1af10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
1af20 64 2c 20 72 65 67 41 64 64 72 41 2c 20 6c 61 62  d, regAddrA, lab
1af30 65 6c 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  elEnd); VdbeCove
1af40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
1af50 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1af60 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
1af70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1af80 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1af90 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
1afa0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1afb0 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
1afc0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1afd0 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
1afe0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1aff0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1b000 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
1b010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b020 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b030 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1b040 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1b050 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b060 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b070 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
1b080 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
1b090 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
1b0a0 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
1b0b0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
1b0c0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1b0d0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
1b0e0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
1b0f0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
1b100 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
1b110 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
1b120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
1b130 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
1b140 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
1b150 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
1b160 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
1b170 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1b180 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
1b190 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20  drA, addrEofA); 
1b1a0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1b1b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b1c0 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70  Goto(v, labelCmp
1b1d0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
1b1e0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
1b1f0 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
1b200 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
1b210 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1b220 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
1b230 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
1b240 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
1b250 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
1b260 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1b270 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1b280 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1b290 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b2a0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
1b2b0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
1b2c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b2d0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1b2e0 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
1b2f0 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fB); VdbeCoverag
1b300 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
1b310 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62 65 6c  dbeGoto(v, label
1b320 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
1b330 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
1b340 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
1b350 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
1b360 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1b370 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
1b380 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1b390 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1b3a0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1b3b0 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65 43  EofA_noB); VdbeC
1b3c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
1b3d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b3e0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
1b3f0 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29  AddrB, addrEofB)
1b400 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1b410 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65  );..  /* Impleme
1b420 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67  nt the main merg
1b430 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
1b440 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1b450 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d  Label(v, labelCm
1b460 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  pr);.  sqlite3Vd
1b470 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
1b480 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30  ermutation, 0, 0
1b490 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72  , 0, (char*)aPer
1b4a0 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41  mute, P4_INTARRA
1b4b0 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  Y);.  sqlite3Vdb
1b4c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
1b4d0 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64  mpare, destA.iSd
1b4e0 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c  st, destB.iSdst,
1b4f0 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   nOrderBy,.     
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d      (char*)pKeyM
1b520 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  erge, P4_KEYINFO
1b530 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1b540 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
1b550 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73  AG_PERMUTE);.  s
1b560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1b570 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64  (v, OP_Jump, add
1b580 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c  rAltB, addrAeqB,
1b590 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62 65   addrAgtB); Vdbe
1b5a0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
1b5b0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 74  /* Jump to the t
1b5c0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64  his point in ord
1b5d0 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  er to terminate 
1b5e0 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1b5f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1b600 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62  olveLabel(v, lab
1b610 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65  elEnd);..  /* Se
1b620 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1b630 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20  output columns. 
1b640 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1b650 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
1b660 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ut ){.    Select
1b670 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69 6f   *pFirst = pPrio
1b680 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 46  r;.    while( pF
1b690 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
1b6a0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
1b6b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65  pPrior;.    gene
1b6c0 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
1b6d0 70 50 61 72 73 65 2c 20 70 46 69 72 73 74 2d 3e  pParse, pFirst->
1b6e0 70 53 72 63 2c 20 70 46 69 72 73 74 2d 3e 70 45  pSrc, pFirst->pE
1b6f0 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  List);.  }..  /*
1b700 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65 20   Reassembly the 
1b710 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 73  compound query s
1b720 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62  o that it will b
1b730 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74 6c  e freed correctl
1b740 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 61  y.  ** by the ca
1b750 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
1b760 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f  /.  if( p->pPrio
1b770 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1b780 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
1b790 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d   p->pPrior);.  }
1b7a0 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70  .  p->pPrior = p
1b7b0 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f 72 2d  Prior;.  pPrior-
1b7c0 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20 20 2f  >pNext = p;..  /
1b7d0 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65 72 74  *** TBD:  Insert
1b7e0 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c   subroutine call
1b7f0 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f  s to close curso
1b800 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65  rs on incomplete
1b810 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69  .  **** subqueri
1b820 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61  es ****/.  expla
1b830 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72  inComposite(pPar
1b840 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31  se, p->op, iSub1
1b850 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20 20 72  , iSub2, 0);.  r
1b860 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45  eturn pParse->nE
1b870 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rr!=0;.}.#endif.
1b880 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1b890 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1b8a0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
1b8b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
1b8c0 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63  )../* An instanc
1b8d0 65 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f  e of the SubstCo
1b8e0 6e 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73  ntext object des
1b8f0 63 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69  cribes an substi
1b900 74 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74  tution edit.** t
1b910 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f  o be performed o
1b920 6e 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a  n a parse tree..
1b930 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65  **.** All refere
1b940 6e 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20  nces to columns 
1b950 69 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  in table iTable 
1b960 61 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  are to be replac
1b970 65 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64  ed by correspond
1b980 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
1b990 6e 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f  ns in pEList..*/
1b9a0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1b9b0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20  SubstContext {. 
1b9c0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
1b9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b9e0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1b9f0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  t */.  int iTabl
1ba00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ba10 20 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65   /* Replace refe
1ba20 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
1ba30 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
1ba40 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
1ba50 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
1ba60 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  nt expressions *
1ba70 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78 74  /.} SubstContext
1ba80 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  ;../* Forward De
1ba90 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
1baa0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
1bab0 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f 6e  xprList(SubstCon
1bac0 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a  text*, ExprList*
1bad0 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
1bae0 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73 74  ubstSelect(Subst
1baf0 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63 74  Context*, Select
1bb00 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
1bb10 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  Scan through the
1bb20 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
1bb30 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65 72  r.  Replace ever
1bb40 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a  y reference to.*
1bb50 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  * a column in ta
1bb60 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c  ble number iTabl
1bb70 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  e with a copy of
1bb80 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a   the iColumn-th.
1bb90 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69  ** entry in pELi
1bba0 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20  st.  (But leave 
1bbb0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1bbc0 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a  e ROWID column .
1bbd0 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a  ** unchanged.).*
1bbe0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1bbf0 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  e is part of the
1bc00 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63   flattening proc
1bc10 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75 65  edure.  A subque
1bc20 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75  ry.** whose resu
1bc30 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e 65  lt set is define
1bc40 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70 65  d by pEList appe
1bc50 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20  ars as entry in 
1bc60 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  the.** FROM clau
1bc70 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
1bc80 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44 42  uch that the VDB
1bc90 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65  E cursor assigne
1bca0 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52  d to that.** FOR
1bcb0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69  M clause entry i
1bcc0 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20  s iTable.  This 
1bcd0 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68  routine makes th
1bce0 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
1bcf0 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
1bd00 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
1bd10 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
1bd20 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
1bd30 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1bd40 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
1bd50 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
1bd60 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
1bd70 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
1bd80 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  xpr(.  SubstCont
1bd90 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f 2a  ext *pSubst,  /*
1bda0 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1bdb0 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  the substitution
1bdc0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
1bdd0 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
1bde0 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75  Expr in which su
1bdf0 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72  bstitution occur
1be00 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
1be10 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
1be20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
1be30 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
1be40 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
1be50 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20 29  pSubst->iTable )
1be60 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1be70 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20  >iColumn<0 ){.  
1be80 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1be90 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TK_NULL;.    }el
1bea0 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
1beb0 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
1bec0 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73 74   *pCopy = pSubst
1bed0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70  ->pEList->a[pExp
1bee0 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70  r->iColumn].pExp
1bef0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
1bf00 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21   pSubst->pEList!
1bf10 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  =0 && pExpr->iCo
1bf20 6c 75 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c  lumn<pSubst->pEL
1bf30 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
1bf40 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
1bf50 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
1bf60 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
1bf70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
1bf80 69 74 65 33 45 78 70 72 49 73 56 65 63 74 6f 72  ite3ExprIsVector
1bf90 28 70 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20  (pCopy) ){.     
1bfa0 20 20 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72     sqlite3Vector
1bfb0 45 72 72 6f 72 4d 73 67 28 70 53 75 62 73 74 2d  ErrorMsg(pSubst-
1bfc0 3e 70 50 61 72 73 65 2c 20 70 43 6f 70 79 29 3b  >pParse, pCopy);
1bfd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1bfe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1bff0 62 20 3d 20 70 53 75 62 73 74 2d 3e 70 50 61 72  b = pSubst->pPar
1c000 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  se->db;.        
1c010 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1c020 70 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c  prDup(db, pCopy,
1c030 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1c040 20 70 4e 65 77 20 26 26 20 28 70 45 78 70 72 2d   pNew && (pExpr-
1c050 3e 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d  >flags & EP_From
1c060 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
1c070 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68 74 4a     pNew->iRightJ
1c080 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78 70 72  oinTable = pExpr
1c090 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1c0a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  e;.          pNe
1c0b0 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 46  w->flags |= EP_F
1c0c0 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 20  romJoin;.       
1c0d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
1c0e0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1c0f0 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
1c100 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20   pExpr = pNew;. 
1c110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c120 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d  else{.    pExpr-
1c130 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78  >pLeft = substEx
1c140 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  pr(pSubst, pExpr
1c150 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45  ->pLeft);.    pE
1c160 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75  xpr->pRight = su
1c170 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20  bstExpr(pSubst, 
1c180 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
1c190 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
1c1a0 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
1c1b0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
1c1c0 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63        substSelec
1c1d0 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  t(pSubst, pExpr-
1c1e0 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a  >x.pSelect, 1);.
1c1f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c200 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70   substExprList(p
1c210 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e  Subst, pExpr->x.
1c220 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
1c230 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
1c240 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1c250 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20  substExprList(. 
1c260 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70   SubstContext *p
1c270 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69  Subst, /* Descri
1c280 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62  ption of the sub
1c290 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45  stitution */.  E
1c2a0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20  xprList *pList  
1c2b0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
1c2c0 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63  scan and in whic
1c2d0 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69  h to make substi
1c2e0 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tutes */.){.  in
1c2f0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1c300 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1c310 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
1c320 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1c330 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70     pList->a[i].p
1c340 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72  Expr = substExpr
1c350 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e  (pSubst, pList->
1c360 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  a[i].pExpr);.  }
1c370 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1c380 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75  ubstSelect(.  Su
1c390 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62  bstContext *pSub
1c3a0 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69  st, /* Descripti
1c3b0 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69  on of the substi
1c3c0 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  tution */.  Sele
1c3d0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1c3e0 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
1c3f0 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
1c400 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
1c410 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  ions */.  int do
1c420 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
1c430 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65  /* Do substitute
1c440 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74  s on p->pPrior t
1c450 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  oo */.){.  SrcLi
1c460 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75  st *pSrc;.  stru
1c470 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c480 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
1c490 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
1c4a0 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75  rn;.  do{.    su
1c4b0 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62  bstExprList(pSub
1c4c0 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  st, p->pEList);.
1c4d0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1c4e0 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72  t(pSubst, p->pGr
1c4f0 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73  oupBy);.    subs
1c500 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74  tExprList(pSubst
1c510 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
1c520 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d      p->pHaving =
1c530 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1c540 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  t, p->pHaving);.
1c550 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
1c560 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1c570 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
1c580 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
1c590 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
1c5a0 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  rc!=0 );.    for
1c5b0 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70  (i=pSrc->nSrc, p
1c5c0 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e  Item=pSrc->a; i>
1c5d0 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; i--, pItem++)
1c5e0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
1c5f0 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65  ect(pSubst, pIte
1c600 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a  m->pSelect, 1);.
1c610 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
1c620 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b  >fg.isTabFunc ){
1c630 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78  .        substEx
1c640 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70  prList(pSubst, p
1c650 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1c660 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1c670 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72  }.  }while( doPr
1c680 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70  ior && (p = p->p
1c690 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23  Prior)!=0 );.}.#
1c6a0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1c6b0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1c6c0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1c6d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1c6e0 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
1c6f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1c700 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1c710 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1c720 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
1c730 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1c740 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
1c750 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
1c760 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
1c770 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
1c780 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1c790 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
1c7a0 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
1c7b0 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
1c7c0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
1c7d0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
1c7e0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
1c7f0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
1c800 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1c810 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
1c820 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
1c830 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
1c840 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
1c850 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
1c860 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
1c870 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
1c880 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
1c890 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
1c8a0 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
1c8b0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
1c8c0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
1c8d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1c8e0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
1c8f0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
1c900 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
1c910 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
1c920 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
1c930 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
1c940 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
1c950 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
1c960 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
1c970 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
1c980 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1c990 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
1c9a0 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
1c9b0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
1c9c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1c9d0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
1c9e0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
1c9f0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
1ca00 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
1ca10 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
1ca20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1ca30 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
1ca40 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
1ca50 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
1ca60 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
1ca70 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
1ca80 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76  mplification giv
1ca90 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
1caa0 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
1cab0 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
1cac0 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
1cad0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
1cae0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
1caf0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
1cb00 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
1cb10 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
1cb20 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
1cb30 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
1cb40 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
1cb50 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
1cb60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1cb70 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
1cb80 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1cb90 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1cba0 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
1cbb0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
1cbc0 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
1cbd0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1cbe0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1cbf0 20 28 32 61 29 20 74 68 65 20 6f 75 74 65 72 20   (2a) the outer 
1cc00 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a  query is not a j
1cc10 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e  oin.**        an
1cc20 64 20 28 32 62 29 20 74 68 65 20 6f 75 74 65 72  d (2b) the outer
1cc30 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1cc40 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20 6f  use subqueries o
1cc50 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1cc60 65 0a 2a 2a 20 20 20 20 20 20 20 20 46 52 4f 4d  e.**        FROM
1cc70 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79  -clause subquery
1cc80 20 74 68 61 74 20 69 73 20 61 20 63 61 6e 64 69   that is a candi
1cc90 64 61 74 65 20 66 6f 72 20 66 6c 61 74 74 65 6e  date for flatten
1cca0 69 6e 67 2e 20 20 28 32 62 20 69 73 0a 2a 2a 20  ing.  (2b is.** 
1ccb0 20 20 20 20 20 20 20 64 75 65 20 74 6f 20 74 69         due to ti
1ccc0 63 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62  cket [2f7170d73b
1ccd0 66 39 61 62 66 38 30 5d 20 66 72 6f 6d 20 32 30  f9abf80] from 20
1cce0 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a  15-02-09.).**.**
1ccf0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
1cd00 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
1cd10 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1cd20 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
1cd30 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
1cd40 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
1cd50 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
1cd60 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
1cd70 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
1cd80 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1cd90 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
1cda0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
1cdb0 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
1cdc0 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
1cdd0 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
1cde0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
1cdf0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
1ce00 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
1ce10 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
1ce20 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
1ce30 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
1ce40 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
1ce50 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
1ce60 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
1ce70 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
1ce80 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
1ce90 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
1cea0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
1ceb0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
1cec0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1ced0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
1cee0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1cef0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1cf00 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
1cf10 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
1cf20 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
1cf30 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
1cf40 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
1cf50 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
1cf60 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
1cf70 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
1cf80 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
1cf90 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
1cfa0 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
1cfb0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
1cfc0 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
1cfd0 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
1cfe0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
1cff0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1d000 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1d010 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
1d020 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
1d030 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
1d040 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1d050 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1d060 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
1d070 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1d080 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1d090 20 20 28 2a 2a 29 20 20 52 65 73 74 72 69 63 74    (**)  Restrict
1d0a0 69 6f 6e 20 28 31 30 29 20 77 61 73 20 72 65 6d  ion (10) was rem
1d0b0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 63 6f  oved from the co
1d0c0 64 65 20 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35  de on 2005-02-05
1d0d0 20 62 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   but we.**      
1d0e0 20 20 61 63 63 69 64 65 6e 74 6c 79 20 63 61 72    accidently car
1d0f0 72 69 65 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ried the comment
1d100 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 32   forward until 2
1d110 30 31 34 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67  014-09-15.  Orig
1d120 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74  inal.**        t
1d130 65 78 74 3a 20 22 54 68 65 20 73 75 62 71 75 65  ext: "The subque
1d140 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1d150 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
1d160 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 0a 2a  e outer query .*
1d170 2a 20 20 20 20 20 20 20 20 64 6f 65 73 20 6e 6f  *        does no
1d180 74 20 75 73 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a  t use LIMIT.".**
1d190 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
1d1a0 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
1d1b0 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
1d1c0 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
1d1d0 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
1d1e0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
1d1f0 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
1d200 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
1d210 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
1d220 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
1d230 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
1d240 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
1d250 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
1d260 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
1d270 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
1d280 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
1d290 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
1d2a0 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
1d2b0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
1d2c0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1d2d0 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
1d2e0 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
1d2f0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
1d300 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
1d310 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
1d320 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
1d330 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
1d340 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
1d350 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
1d360 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
1d370 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
1d380 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
1d390 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
1d3a0 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
1d3b0 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
1d3c0 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
1d3d0 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
1d3e0 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
1d3f0 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
1d400 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
1d410 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
1d420 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
1d430 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
1d440 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
1d450 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
1d460 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1d470 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
1d480 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
1d490 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
1d4a0 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
1d4b0 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
1d4c0 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
1d4d0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
1d4e0 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
1d4f0 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1d500 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1d510 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
1d520 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1d530 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
1d540 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
1d550 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
1d560 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
1d570 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
1d580 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
1d590 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
1d5a0 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
1d5b0 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
1d5c0 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
1d5d0 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
1d5e0 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
1d5f0 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
1d600 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
1d610 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
1d620 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
1d630 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
1d640 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
1d650 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
1d660 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
1d670 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
1d680 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
1d690 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
1d6a0 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
1d6b0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
1d6c0 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
1d6d0 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
1d6e0 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
1d6f0 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
1d700 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
1d710 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
1d720 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
1d730 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
1d740 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
1d750 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
1d760 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
1d770 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
1d780 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
1d790 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
1d7a0 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
1d7b0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
1d7c0 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
1d7d0 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
1d7e0 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
1d7f0 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
1d800 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
1d810 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
1d820 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
1d830 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
1d840 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
1d850 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
1d860 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
1d870 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
1d880 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
1d890 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1d8a0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1d8b0 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
1d8c0 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
1d8d0 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
1d8e0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
1d8f0 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
1d900 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
1d910 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
1d920 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
1d930 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
1d940 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1d950 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
1d960 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1d970 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
1d980 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
1d990 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
1d9a0 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
1d9b0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1d9c0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1d9d0 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
1d9e0 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
1d9f0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
1da00 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
1da10 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
1da20 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
1da30 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
1da40 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
1da50 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
1da60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1da70 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
1da80 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
1da90 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
1daa0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
1dab0 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
1dac0 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
1dad0 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
1dae0 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
1daf0 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
1db00 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
1db10 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1db20 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1db30 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1db40 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
1db50 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
1db60 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
1db70 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
1db80 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75   (22)  The subqu
1db90 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ery is not a rec
1dba0 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a  ursive CTE..**.*
1dbb0 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72  *  (23)  The par
1dbc0 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63  ent is not a rec
1dbd0 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74  ursive CTE, or t
1dbe0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
1dbf0 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  not a.**        
1dc00 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20  compound query. 
1dc10 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e  This restriction
1dc20 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e   is because tran
1dc30 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20  sforming the.** 
1dc40 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f         parent to
1dc50 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
1dc60 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63  y confuses the c
1dc70 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73  ode that handles
1dc80 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72  .**        recur
1dc90 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20  sive queries in 
1dca0 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a  multiSelect()..*
1dcb0 2a 0a 2a 2a 20 20 28 32 34 29 20 20 54 68 65 20  *.**  (24)  The 
1dcc0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
1dcd0 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68 61  an aggregate tha
1dce0 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c 74  t uses the built
1dcf0 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a 2a  -in min() or .**
1dd00 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28 29          or max()
1dd10 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57 69   functions.  (Wi
1dd20 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74 72  thout this restr
1dd30 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79 20  iction, a query 
1dd40 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20 20  like:.**        
1dd50 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28  "SELECT x FROM (
1dd60 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20 78  SELECT max(y), x
1dd70 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c 64   FROM t1)" would
1dd80 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1dd90 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75 72  .**        retur
1dda0 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66 6f  n the value X fo
1ddb0 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d 61  r which Y was ma
1ddc0 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a 2a  ximal.).**.**.**
1ddd0 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65   In this routine
1dde0 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65  , the "p" parame
1ddf0 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
1de00 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75   to the outer qu
1de10 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71  ery..** The subq
1de20 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d  uery is p->pSrc-
1de30 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67  >a[iFrom].  isAg
1de40 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1de50 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20   outer query.** 
1de60 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20  uses aggregates 
1de70 61 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67  and subqueryIsAg
1de80 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
1de90 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61   subquery uses a
1dea0 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
1deb0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1dec0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c  s not attempted,
1ded0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1dee0 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74   a no-op and ret
1def0 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c  urns 0..** If fl
1df00 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65  attening is atte
1df10 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69  mpted this routi
1df20 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a  ne returns 1..**
1df30 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65  .** All of the e
1df40 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73  xpression analys
1df50 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e  is must occur on
1df60 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20   both the outer 
1df70 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65  query and.** the
1df80 20 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65   subquery before
1df90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
1dfa0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1dfb0 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72  t flattenSubquer
1dfc0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
1dfd0 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
1dfe0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1dff0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1e000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1e010 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45  rent or outer SE
1e020 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
1e030 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
1e040 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e050 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  x in p->pSrc->a[
1e060 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73  ] of the inner s
1e070 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  ubquery */.  int
1e080 20 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20   isAgg,         
1e090 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74    /* True if out
1e0a0 65 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61  er SELECT uses a
1e0b0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1e0c0 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71  ns */.  int subq
1e0d0 75 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20  ueryIsAgg    /* 
1e0e0 54 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  True if the subq
1e0f0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1e100 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1e110 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1e120 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
1e130 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
1e140 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65  uthContext;.  Se
1e150 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20  lect *pParent;  
1e160 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49    /* Current UNI
1e170 4f 4e 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74  ON ALL term of t
1e180 68 65 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a  he other query *
1e190 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1e1a0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
1e1b0 6e 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73  nner query or "s
1e1c0 75 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65  ubquery" */.  Se
1e1d0 6c 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20  lect *pSub1;    
1e1e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1e1f0 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65  the rightmost se
1e200 6c 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72  lect in sub-quer
1e210 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  y */.  SrcList *
1e220 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68  pSrc;      /* Th
1e230 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1e240 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1e250 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1e260 53 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65  SubSrc;   /* The
1e270 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1e280 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
1e290 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1e2a0 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  t;    /* The res
1e2b0 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f  ult set of the o
1e2c0 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1e2d0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
1e2e0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
1e2f0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
1e300 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
1e310 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
1e320 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1e330 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1e340 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  nter */.  Expr *
1e350 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1e360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e370 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a  e WHERE clause *
1e380 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1e390 73 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65  st_item *pSubite
1e3a0 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  m;   /* The subq
1e3b0 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
1e3c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1e3d0 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  db;..  /* Check 
1e3e0 74 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65  to see if flatte
1e3f0 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65  ning is permitte
1e400 64 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  d.  Return 0 if 
1e410 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  not..  */.  asse
1e420 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
1e430 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d  sert( p->pPrior=
1e440 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65  =0 );  /* Unable
1e450 20 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70   to flatten comp
1e460 6f 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a  ound queries */.
1e470 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
1e480 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
1e490 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
1e4a0 65 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30  ener) ) return 0
1e4b0 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
1e4c0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1e4d0 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26  rc && iFrom>=0 &
1e4e0 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53  & iFrom<pSrc->nS
1e4f0 72 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  rc );.  pSubitem
1e500 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f   = &pSrc->a[iFro
1e510 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20  m];.  iParent = 
1e520 70 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f  pSubitem->iCurso
1e530 72 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62  r;.  pSub = pSub
1e540 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  item->pSelect;. 
1e550 20 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30   assert( pSub!=0
1e560 20 29 3b 0a 20 20 69 66 28 20 73 75 62 71 75 65   );.  if( subque
1e570 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 69  ryIsAgg ){.    i
1e580 66 28 20 69 73 41 67 67 20 29 20 72 65 74 75 72  f( isAgg ) retur
1e590 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1e5c0 6f 6e 20 28 31 29 20 20 20 2a 2f 0a 20 20 20 20  on (1)   */.    
1e5d0 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31  if( pSrc->nSrc>1
1e5e0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e600 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1e610 69 6f 6e 20 28 32 61 29 20 20 2a 2f 0a 20 20 20  ion (2a)  */.   
1e620 20 69 66 28 20 28 70 2d 3e 70 57 68 65 72 65 20   if( (p->pWhere 
1e630 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
1e640 74 79 28 70 2d 3e 70 57 68 65 72 65 2c 45 50 5f  ty(p->pWhere,EP_
1e650 53 75 62 71 75 65 72 79 29 29 0a 20 20 20 20 20  Subquery)).     
1e660 7c 7c 20 28 73 71 6c 69 74 65 33 45 78 70 72 4c  || (sqlite3ExprL
1e670 69 73 74 46 6c 61 67 73 28 70 2d 3e 70 45 4c 69  istFlags(p->pELi
1e680 73 74 29 20 26 20 45 50 5f 53 75 62 71 75 65 72  st) & EP_Subquer
1e690 79 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 28 73  y)!=0.     || (s
1e6a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 46 6c  qlite3ExprListFl
1e6b0 61 67 73 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  ags(p->pOrderBy)
1e6c0 20 26 20 45 50 5f 53 75 62 71 75 65 72 79 29 21   & EP_Subquery)!
1e6d0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1e6e0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e710 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1e720 6e 20 28 32 62 29 20 20 2a 2f 0a 20 20 20 20 7d  n (2b)  */.    }
1e730 0a 20 20 7d 0a 20 20 20 20 0a 20 20 70 53 75 62  .  }.    .  pSub
1e740 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1e750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1e760 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
1e770 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
1e780 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
1e790 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
1e7a0 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
1e7b0 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
1e7c0 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
1e7d0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1e7e0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1e7f0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1e800 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1e810 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1e820 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1e830 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1e840 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1e850 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1e860 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1e870 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1e880 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1e890 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1e8a0 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1e8b0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1e8c0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1e8d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1e8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1e8f0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1e900 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1e910 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1e940 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1e950 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1e960 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
1e970 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
1e980 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
1e990 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1e9d0 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
1e9e0 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
1e9f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea10 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1ea20 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
1ea30 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1ea40 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
1ea50 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1ea60 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1ea70 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69  tion (5)  */.  i
1ea80 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1ea90 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
1eaa0 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
1eab0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1eac0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ead0 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
1eae0 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c   }.  if( (p->sel
1eaf0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1eb00 6e 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75  nct)!=0 && subqu
1eb10 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1eb20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1eb30 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1eb40 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20  n (6)  */.  }.  
1eb50 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1eb60 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
1eb70 79 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  y ){.     return
1eb80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ebb0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31   Restriction (11
1ebc0 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69  ) */.  }.  if( i
1ebd0 73 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f  sAgg && pSub->pO
1ebe0 72 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20  rderBy ) return 
1ebf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ec00 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ec10 20 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70   (16) */.  if( p
1ec20 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
1ec30 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
1ec40 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ec50 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ec60 20 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70   (19) */.  if( p
1ec70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28  Sub->pLimit && (
1ec80 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1ec90 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b  _Distinct)!=0 ){
1eca0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1ecb0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1ecc0 69 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20  iction (21) */. 
1ecd0 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
1ece0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
1ecf0 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 3b 0a  SF_Recursive );.
1ed00 20 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62    testcase( pSub
1ed10 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1ed20 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 69  MinMaxAgg );.  i
1ed30 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
1ed40 73 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76  s & (SF_Recursiv
1ed50 65 7c 53 46 5f 4d 69 6e 4d 61 78 41 67 67 29 20  e|SF_MinMaxAgg) 
1ed60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1ed70 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
1ed80 20 28 32 32 29 20 61 6e 64 20 28 32 34 29 20 2a   (22) and (24) *
1ed90 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1eda0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1edb0 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75 62  cursive) && pSub
1edc0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1edd0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73  return 0; /* Res
1ede0 74 72 69 63 74 69 6f 6e 20 28 32 33 29 20 2a 2f  triction (23) */
1edf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c  .  }..  /* OBSOL
1ee00 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20  ETE COMMENT 1:. 
1ee10 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   ** Restriction 
1ee20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3:  If the subqu
1ee30 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d  ery is a join, m
1ee40 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1ee50 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e  query is .  ** n
1ee60 6f 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72  ot used as the r
1ee70 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1ee80 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20  an outer join.  
1ee90 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  Examples of why 
1eea0 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  this.  ** is not
1eeb0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
1eec0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
1eed0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
1eee0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
1eef0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1ef00 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1ef10 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1ef20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1ef30 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1ef40 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
1ef50 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
1ef60 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
1ef70 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
1ef80 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43  .  ** OBSOLETE C
1ef90 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52  OMMENT 2:.  ** R
1efa0 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20  estriction 12:  
1efb0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1efc0 69 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  is the right ope
1efd0 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f  rand of a left o
1efe0 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20  uter.  ** join, 
1eff0 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75  make sure the su
1f000 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48  bquery has no WH
1f010 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ERE clause..  **
1f020 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20   An examples of 
1f030 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20  why this is not 
1f040 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1f050 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1f060 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53  FT OUTER JOIN (S
1f070 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
1f080 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20  WHERE t2.x>0).  
1f090 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
1f0a0 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
1f0b0 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
1f0c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1f0d0 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
1f0e0 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32  OIN t2) WHERE t2
1f0f0 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  .x>0.  **.  ** B
1f100 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65  ut the t2.x>0 te
1f110 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  st will always f
1f120 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f  ail on a NULL ro
1f130 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20  w of t2, which. 
1f140 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20   ** effectively 
1f150 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54  converts the OUT
1f160 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20  ER JOIN into an 
1f170 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a  INNER JOIN..  **
1f180 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52  .  ** THIS OVERR
1f190 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f  IDES OBSOLETE CO
1f1a0 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41  MMENTS 1 AND 2 A
1f1b0 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65  BOVE:.  ** Ticke
1f1c0 74 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68  t #3300 shows th
1f1d0 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68  at flattening th
1f1e0 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
1f1f0 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a  a LEFT JOIN.  **
1f200 20 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68   is fraught with
1f210 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74   danger.  Best t
1f220 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c  o avoid the whol
1f230 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65  e thing.  If the
1f240 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69  .  ** subquery i
1f250 73 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  s the right term
1f260 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   of a LEFT JOIN,
1f270 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
1f280 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tten..  */.  if(
1f290 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a   (pSubitem->fg.j
1f2a0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1f2b0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1f2c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1f2d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1f2e0 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1f2f0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1f300 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1f310 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1f320 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1f330 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1f340 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1f350 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1f360 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1f370 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1f380 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1f390 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1f3a0 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1f3b0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1f3c0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1f3d0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1f3e0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1f3f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f400 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1f410 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1f420 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1f430 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1f440 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1f450 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1f460 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1f470 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1f480 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1f490 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1f4a0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1f4b0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1f4c0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1f4d0 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1f4e0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1f4f0 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1f500 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1f510 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1f520 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1f530 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1f540 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1f550 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1f560 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  c!=0 );.      as
1f570 73 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69  sert( pSub->pELi
1f580 73 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31  st->nExpr==pSub1
1f590 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
1f5a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1f5b0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1f5c0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1f5d0 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1f5e0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1f5f0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1f600 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1f610 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1f620 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1f630 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
1f640 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1f650 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f660 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
1f670 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  c>1 );.    }..  
1f680 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1f690 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   18. */.    if( 
1f6a0 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  p->pOrderBy ){. 
1f6b0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1f6c0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1f6d0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1f6e0 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  pr; ii++){.     
1f6f0 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72     if( p->pOrder
1f700 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f  By->a[ii].u.x.iO
1f710 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72  rderByCol==0 ) r
1f720 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1f730 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f740 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
1f750 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
1f760 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1f770 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
1f780 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
1f790 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
1f7a0 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %s.%p from term 
1f7b0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1f7c0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
1f7d0 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20  zSelName, pSub, 
1f7e0 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41  iFrom));..  /* A
1f7f0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
1f800 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
1f810 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
1f820 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
1f830 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
1f840 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
1f850 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1f860 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
1f870 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
1f880 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
1f890 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
1f8a0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
1f8b0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
1f8c0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
1f8d0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1f8e0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1f8f0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
1f900 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
1f910 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
1f920 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
1f930 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
1f940 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
1f950 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
1f960 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
1f970 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
1f980 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
1f990 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
1f9a0 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
1f9b0 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
1f9c0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
1f9d0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
1f9e0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
1f9f0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
1fa00 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
1fa10 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
1fa20 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
1fa30 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
1fa40 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
1fa50 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
1fa60 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
1fa70 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
1fa80 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
1fa90 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
1faa0 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
1fab0 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
1fac0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
1fad0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
1fae0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1faf0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
1fb00 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
1fb10 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
1fb20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
1fb30 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
1fb40 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
1fb50 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1fb60 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1fb70 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1fb80 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
1fb90 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
1fba0 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
1fbb0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
1fbc0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
1fbd0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
1fbe0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1fbf0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
1fc00 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
1fc10 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
1fc20 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
1fc30 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1fc40 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1fc50 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
1fc60 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
1fc70 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1fc80 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1fc90 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
1fca0 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
1fcb0 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
1fcc0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
1fcd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
1fce0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
1fcf0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1fd00 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
1fd10 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
1fd20 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
1fd30 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1fd40 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
1fd50 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
1fd60 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
1fd70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1fd80 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
1fd90 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78  ->pLimit;.    Ex
1fda0 70 72 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d  pr *pOffset = p-
1fdb0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65  >pOffset;.    Se
1fdc0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
1fdd0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
1fde0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1fdf0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
1fe00 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
1fe10 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
1fe20 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66   = 0;.    p->pOf
1fe30 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e  fset = 0;.    pN
1fe40 65 77 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ew = sqlite3Sele
1fe50 63 74 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b  ctDup(db, p, 0);
1fe60 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
1fe70 63 74 53 65 74 4e 61 6d 65 28 70 4e 65 77 2c 20  ctSetName(pNew, 
1fe80 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b  pSub->zSelName);
1fe90 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  .    p->pOffset 
1fea0 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  = pOffset;.    p
1feb0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
1fec0 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  t;.    p->pOrder
1fed0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1fee0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72     p->pSrc = pSr
1fef0 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54  c;.    p->op = T
1ff00 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70  K_ALL;.    if( p
1ff10 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1ff20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
1ff30 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
1ff40 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
1ff50 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1ff60 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 20 70    if( pPrior ) p
1ff70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
1ff80 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  New;.      pNew-
1ff90 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
1ffa0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
1ffb0 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ew;.      SELECT
1ffc0 54 52 41 43 45 28 32 2c 70 50 61 72 73 65 2c 70  TRACE(2,pParse,p
1ffd0 2c 0a 20 20 20 20 20 20 20 20 20 28 22 63 6f 6d  ,.         ("com
1ffe0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
1fff0 6c 61 74 74 65 6e 65 72 20 63 72 65 61 74 65 73  lattener creates
20000 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e   %s.%p as peer\n
20010 22 2c 0a 20 20 20 20 20 20 20 20 20 70 4e 65 77  ",.         pNew
20020 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77  ->zSelName, pNew
20030 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
20040 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
20050 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
20060 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66   }..  /* Begin f
20070 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46  lattening the iF
20080 72 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20  rom-th entry of 
20090 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
200a0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  .  ** in the out
200b0 65 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  er query..  */. 
200c0 20 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20   pSub = pSub1 = 
200d0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
200e0 74 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  t;..  /* Delete 
200f0 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61  the transient ta
20100 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ble structure as
20110 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20120 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a  e.  ** subquery.
20130 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
20140 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
20150 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
20160 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
20170 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  b, pSubitem->zNa
20180 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
20190 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
201a0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53  m->zAlias);.  pS
201b0 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
201c0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
201d0 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  m->zName = 0;.  
201e0 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73  pSubitem->zAlias
201f0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
20200 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a  ->pSelect = 0;..
20210 20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74    /* Defer delet
20220 69 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62  ing the Table ob
20230 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
20240 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75  with the.  ** su
20250 62 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64  bquery until cod
20260 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a  e generation is.
20270 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73    ** complete, s
20280 69 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73  ince there may s
20290 74 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e  till exist Expr.
202a0 70 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61  pTab entries tha
202b0 74 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20  t.  ** refer to 
202c0 74 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65  the subquery eve
202d0 6e 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69  n after flatteni
202e0 6e 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34  ng.  Ticket #334
202f0 36 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75  6..  **.  ** pSu
20300 62 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61  bitem->pTab is a
20310 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62  lways non-NULL b
20320 79 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69  y test restricti
20330 6f 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62  ons and tests ab
20340 6f 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ove..  */.  if( 
20350 41 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d  ALWAYS(pSubitem-
20360 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
20370 20 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65   Table *pTabToDe
20380 6c 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54  l = pSubitem->pT
20390 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
203a0 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d  ToDel->nTabRef==
203b0 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65  1 ){.      Parse
203c0 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
203d0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
203e0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  el(pParse);.    
203f0 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65    pTabToDel->pNe
20400 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c  xtZombie = pTopl
20410 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62  evel->pZombieTab
20420 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  ;.      pTopleve
20430 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20  l->pZombieTab = 
20440 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d  pTabToDel;.    }
20450 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
20460 54 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d  ToDel->nTabRef--
20470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
20480 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  item->pTab = 0;.
20490 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
204a0 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
204b0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
204c0 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75  term in a compou
204d0 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a  nd-subquery.  **
204e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20   flattening (as 
204f0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29  described above)
20500 2e 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  .  If we are doi
20510 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b  ng a different k
20520 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74  ind.  ** of flat
20530 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74  tening - a flatt
20540 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  ening other than
20550 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
20560 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20  uery flattening 
20570 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73  -.  ** then this
20580 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20   loop only runs 
20590 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  once..  **.  ** 
205a0 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20  This loop moves 
205b0 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  all of the FROM 
205c0 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
205d0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
205e0 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  e.  ** the FROM 
205f0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
20600 74 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f  ter query.  Befo
20610 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72  re doing this, r
20620 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65  emember.  ** the
20630 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
20640 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
20650 6f 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d  outer query FROM
20660 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a   element in.  **
20670 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69   iParent.  The i
20680 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69  Parent cursor wi
20690 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
206a0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f  .  Subsequent co
206b0 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  de.  ** will sca
206c0 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f  n expressions lo
206d0 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e  oking for iParen
206e0 74 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  t references and
206f0 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68   replace.  ** th
20700 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77  ose references w
20710 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ith expressions 
20720 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20  that resolve to 
20730 74 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f  the subquery FRO
20740 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20  M.  ** elements 
20750 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69  we are now copyi
20760 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ng in..  */.  fo
20770 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61  r(pParent=p; pPa
20780 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50  rent; pParent=pP
20790 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70  arent->pPrior, p
207a0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
207b0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53  ){.    int nSubS
207c0 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74  rc;.    u8 joint
207d0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75  ype = 0;.    pSu
207e0 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72  bSrc = pSub->pSr
207f0 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
20800 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72  lause of subquer
20810 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63  y */.    nSubSrc
20820 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63   = pSubSrc->nSrc
20830 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
20840 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72  terms in subquer
20850 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  y FROM clause */
20860 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72  .    pSrc = pPar
20870 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  ent->pSrc;     /
20880 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
20890 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
208a0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72   */..    if( pSr
208b0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
208c0 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b  t( pParent==p );
208d0 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20    /* First time 
208e0 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
208f0 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79   */.      jointy
20900 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66  pe = pSubitem->f
20910 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  g.jointype;.    
20920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
20930 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
20940 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
20950 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
20960 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
20970 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
20980 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
20990 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
209a0 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
209b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
209c0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
209d0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
209e0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
209f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20a00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
20a10 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
20a20 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
20a30 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
20a40 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
20a50 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
20a60 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
20a70 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
20a80 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
20a90 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
20aa0 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
20ab0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
20ac0 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
20ad0 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
20ae0 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
20af0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
20b00 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
20b10 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
20b20 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
20b30 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
20b40 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
20b50 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
20b60 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
20b70 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
20b80 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
20b90 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
20ba0 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
20bb0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
20bc0 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
20bd0 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
20be0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
20bf0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
20c00 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
20c10 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
20c20 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63  ter query FROM c
20c30 6c 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73  lause to 4 slots
20c40 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64  ..    ** The mid
20c50 64 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61  dle slot is expa
20c60 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74  nded to two slot
20c70 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  s in order to ma
20c80 6b 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20  ke space.    ** 
20c90 66 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d  for the two elem
20ca0 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  ents in the FROM
20cb0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73   clause of the s
20cc0 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  ubquery..    */.
20cd0 20 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e      if( nSubSrc>
20ce0 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65  1 ){.      pPare
20cf0 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20  nt->pSrc = pSrc 
20d00 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
20d10 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63  Enlarge(db, pSrc
20d20 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f  , nSubSrc-1,iFro
20d30 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+1);.      if( 
20d40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
20d50 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
20d60 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
20d70 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65  ..    /* Transfe
20d80 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  r the FROM claus
20d90 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  e terms from the
20da0 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74   subquery into t
20db0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
20dc0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  query..    */.  
20dd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
20de0 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bSrc; i++){.    
20df0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
20e00 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e  elete(db, pSrc->
20e10 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e  a[i+iFrom].pUsin
20e20 67 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  g);.      assert
20e30 28 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  ( pSrc->a[i+iFro
20e40 6d 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m].fg.isTabFunc=
20e50 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63  =0 );.      pSrc
20e60 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
20e70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
20e80 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
20e90 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
20ea0 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
20eb0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
20ec0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
20ed0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
20ee0 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
20ef0 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
20f00 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
20f10 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
20f20 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
20f30 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
20f40 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
20f50 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20f60 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
20f70 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
20f80 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
20f90 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
20fa0 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
20fb0 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
20fc0 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
20fd0 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
20fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
20ff0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
21000 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
21010 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
21020 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
21030 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
21040 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
21050 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
21060 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
21070 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
21080 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
21090 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
210a0 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
210b0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
210c0 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
210d0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
210e0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
210f0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
21100 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
21110 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
21120 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
21130 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
21140 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
21150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
21160 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
21170 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
21180 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
21190 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
211a0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53  , pList->a[i].zS
211b0 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  pan);.        sq
211c0 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61  lite3Dequote(zNa
211d0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  me);.        pLi
211e0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
211f0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a   zName;.      }.
21200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53      }.    if( pS
21210 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
21220 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
21230 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
21240 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
21250 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
21260 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
21270 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
21280 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
21290 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
212a0 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
212b0 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
212c0 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
212d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
212e0 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
212f0 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
21300 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
21310 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
21320 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
21330 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
21340 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
21350 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
21360 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
21370 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
21380 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
21390 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
213a0 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
213b0 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
213c0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
213d0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
213e0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
213f0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
21400 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
21410 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
21420 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
21430 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
21440 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
21450 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
21460 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
21470 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
21480 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
21490 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
214a0 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
214b0 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
214c0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
214d0 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
214e0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
214f0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
21500 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
21510 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
21520 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
21530 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21540 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
21550 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
21560 65 72 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f  ert( pSub->pPrio
21570 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  r==0 );.      pP
21580 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20  arent->pOrderBy 
21590 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
215a0 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
215b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
215c0 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
215d0 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
215e0 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
215f0 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
21600 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Agg ){.      ass
21610 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48  ert( pParent->pH
21620 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
21630 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
21640 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57  ng = pParent->pW
21650 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
21660 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  ent->pWhere = pW
21670 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
21680 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
21690 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
216a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
216b0 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
216c0 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30  pSub->pHaving, 0
216d0 29 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  ), pParent->pHav
216e0 69 6e 67 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ing.      );.   
216f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
21700 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
21710 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
21720 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
21730 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
21740 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
21750 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
21760 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
21770 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
21780 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57  e3ExprAnd(db, pW
21790 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70  here, pParent->p
217a0 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
217b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
217c0 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
217d0 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
217e0 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  x;.      x.pPars
217f0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
21800 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61    x.iTable = iPa
21810 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 70 45  rent;.      x.pE
21820 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45 4c  List = pSub->pEL
21830 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ist;.      subst
21840 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72 65  Select(&x, pPare
21850 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  nt, 0);.    }.  
21860 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
21870 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
21880 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
21890 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
218a0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
218b0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
218c0 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
218d0 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
218e0 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
218f0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
21900 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
21910 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
21920 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
21930 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
21940 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
21950 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
21960 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
21970 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
21980 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
21990 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
219a0 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
219b0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
219c0 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
219d0 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
219e0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
219f0 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
21a00 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
21a10 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
21a20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
21a30 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
21a40 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
21a50 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
21a60 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
21a70 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
21a80 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
21a90 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
21aa0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
21ab0 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  1);..#if SELECTT
21ac0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
21ad0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
21ae0 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
21af0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
21b00 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
21b10 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e 69  ("After flatteni
21b20 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  ng:\n"));.    sq
21b30 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
21b40 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
21b50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
21b60 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
21b70 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
21b80 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
21b90 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
21ba0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
21bb0 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
21bc0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
21bd0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
21be0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21bf0 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  VIEW)./*.** Make
21c00 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65 76   copies of relev
21c10 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73 65  ant WHERE clause
21c20 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f 75   terms of the ou
21c30 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a 2a  ter query into.*
21c40 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
21c50 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e 20  se of subquery. 
21c60 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   Example:.**.** 
21c70 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
21c80 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c   (SELECT a AS x,
21c90 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74   c-d AS y FROM t
21ca0 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e 44  1) WHERE x=5 AND
21cb0 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61   y=10;.**.** Tra
21cc0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a  nsformed into:.*
21cd0 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
21ce0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61 20   FROM (SELECT a 
21cf0 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20 46  AS x, c-d AS y F
21d00 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
21d10 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a 20   AND c-d=10).** 
21d20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41 4e      WHERE x=5 AN
21d30 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68  D y=10;.**.** Th
21d40 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20 74  e hope is that t
21d50 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20 74  he terms added t
21d60 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65 72  o the inner quer
21d70 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20 6d  y will make it m
21d80 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e 74  ore.** efficient
21d90 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ..**.** Do not a
21da0 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74 69  ttempt this opti
21db0 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a  mization if:.**.
21dc0 2a 2a 20 20 20 28 31 29 20 54 68 65 20 69 6e 6e  **   (1) The inn
21dd0 65 72 20 71 75 65 72 79 20 69 73 20 61 6e 20 61  er query is an a
21de0 67 67 72 65 67 61 74 65 2e 20 20 28 49 6e 20 74  ggregate.  (In t
21df0 68 61 74 20 63 61 73 65 2c 20 77 65 27 64 20 72  hat case, we'd r
21e00 65 61 6c 6c 79 20 77 61 6e 74 0a 2a 2a 20 20 20  eally want.**   
21e10 20 20 20 20 74 6f 20 63 6f 70 79 20 74 68 65 20      to copy the 
21e20 6f 75 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75  outer WHERE-clau
21e30 73 65 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  se terms onto th
21e40 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  e HAVING clause 
21e50 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
21e60 69 6e 6e 65 72 20 71 75 65 72 79 2e 20 20 42 75  inner query.  Bu
21e70 74 20 74 68 65 79 20 70 72 6f 62 61 62 6c 79 20  t they probably 
21e80 77 6f 6e 27 74 20 68 65 6c 70 20 74 68 65 72 65  won't help there
21e90 20 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65   so do not bothe
21ea0 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20  r.).**.**   (2) 
21eb0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21ec0 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65  is the recursive
21ed0 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f   part of a commo
21ee0 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69  n table expressi
21ef0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20  on..**.**   (3) 
21f00 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
21f10 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  has a LIMIT clau
21f20 73 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68  se (since the ch
21f30 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45  anges to the WHE
21f40 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73  RE.**       clos
21f50 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74  e would change t
21f60 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
21f70 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20  e LIMIT)..**.** 
21f80 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20    (4) The inner 
21f90 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
21fa0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
21fb0 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 28 54 68 65  LEFT JOIN.  (The
21fc0 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 20 20 20   caller.**      
21fd0 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 72   enforces this r
21fe0 65 73 74 72 69 63 74 69 6f 6e 20 73 69 6e 63 65  estriction since
21ff0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   this routine do
22000 65 73 20 6e 6f 74 20 68 61 76 65 20 65 6e 6f 75  es not have enou
22010 67 68 0a 2a 2a 20 20 20 20 20 20 20 69 6e 66 6f  gh.**       info
22020 72 6d 61 74 69 6f 6e 20 74 6f 20 6b 6e 6f 77 2e  rmation to know.
22030 29 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54 68  ).**.**   (5) Th
22040 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  e WHERE clause e
22050 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e  xpression origin
22060 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20 6f  ates in the ON o
22070 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 2a  r USING clause.*
22080 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45 46  *       of a LEF
22090 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 52 65  T JOIN..**.** Re
220a0 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68 61  turn 0 if no cha
220b0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61 6e  nges are made an
220c0 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e  d non-zero if on
220d0 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45 20  e or more WHERE 
220e0 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 20  clause.** terms 
220f0 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20 69  are duplicated i
22100 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79  nto the subquery
22110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22120 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72  pushDownWhereTer
22130 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
22140 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
22150 61 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66 6f  arse context (fo
22160 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 65  r malloc() and e
22170 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29 20  rror reporting) 
22180 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
22190 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  bq,        /* Th
221a0 65 20 73 75 62 71 75 65 72 79 20 77 68 6f 73 65  e subquery whose
221b0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
221c0 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65 64   to be augmented
221d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
221e0 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  re,         /* T
221f0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
22200 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
22210 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  ry */.  int iCur
22220 73 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sor           /*
22230 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
22240 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  f the subquery *
22250 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  /.){.  Expr *pNe
22260 77 3b 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d  w;.  int nChng =
22270 20 30 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58   0;.  Select *pX
22280 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
22290 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
222a0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
222b0 20 69 6e 20 70 53 75 62 71 20 2a 2f 0a 20 20 69   in pSubq */.  i
222c0 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72  f( pWhere==0 ) r
222d0 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 70  eturn 0;.  for(p
222e0 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d  X=pSubq; pX; pX=
222f0 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  pX->pPrior){.   
22300 20 69 66 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61   if( (pX->selFla
22310 67 73 20 26 20 28 53 46 5f 41 67 67 72 65 67 61  gs & (SF_Aggrega
22320 74 65 7c 53 46 5f 52 65 63 75 72 73 69 76 65 29  te|SF_Recursive)
22330 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )!=0 ){.      te
22340 73 74 63 61 73 65 28 20 70 58 2d 3e 73 65 6c 46  stcase( pX->selF
22350 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
22360 61 74 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ate );.      tes
22370 74 63 61 73 65 28 20 70 58 2d 3e 73 65 6c 46 6c  tcase( pX->selFl
22380 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
22390 76 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ve );.      test
223a0 63 61 73 65 28 20 70 58 21 3d 70 53 75 62 71 20  case( pX!=pSubq 
223b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
223c0 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f  0; /* restrictio
223d0 6e 73 20 28 31 29 20 61 6e 64 20 28 32 29 20 2a  ns (1) and (2) *
223e0 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  /.    }.  }.  if
223f0 28 20 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21  ( pSubq->pLimit!
22400 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
22410 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
22420 6f 6e 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (3) */.  }.  
22430 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f  while( pWhere->o
22440 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
22450 20 6e 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f   nChng += pushDo
22460 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
22470 72 73 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65  rse, pSubq, pWhe
22480 72 65 2d 3e 70 52 69 67 68 74 2c 20 69 43 75 72  re->pRight, iCur
22490 73 6f 72 29 3b 0a 20 20 20 20 70 57 68 65 72 65  sor);.    pWhere
224a0 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c 65 66 74   = pWhere->pLeft
224b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72  ;.  }.  if( Expr
224c0 48 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65  HasProperty(pWhe
224d0 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  re,EP_FromJoin) 
224e0 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72  ) return 0; /* r
224f0 65 73 74 72 69 63 74 69 6f 6e 20 35 20 2a 2f 0a  estriction 5 */.
22500 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
22510 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74  rIsTableConstant
22520 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72  (pWhere, iCursor
22530 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b  ) ){.    nChng++
22540 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 75  ;.    while( pSu
22550 62 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73  bq ){.      Subs
22560 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20  tContext x;.    
22570 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
22580 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e  ExprDup(pParse->
22590 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a  db, pWhere, 0);.
225a0 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
225b0 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
225c0 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  .iTable = iCurso
225d0 72 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  r;.      x.pELis
225e0 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73  t = pSubq->pELis
225f0 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  t;.      pNew = 
22600 73 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e  substExpr(&x, pN
22610 65 77 29 3b 0a 20 20 20 20 20 20 70 53 75 62 71  ew);.      pSubq
22620 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
22630 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65  e3ExprAnd(pParse
22640 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 57 68  ->db, pSubq->pWh
22650 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ere, pNew);.    
22660 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d    pSubq = pSubq-
22670 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20  >pPrior;.    }. 
22680 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e   }.  return nChn
22690 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  g;.}.#endif /* !
226a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
226b0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
226c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
226d0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
226e0 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74  /*.** Based on t
226f0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
22700 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
22710 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
22720 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  y the first.** a
22730 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75  rgument, this fu
22740 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66  nction checks if
22750 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
22760 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
22770 20 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f    * the query co
22780 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69  ntains just a si
22790 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66  ngle aggregate f
227a0 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a  unction,.**    *
227b0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66   the aggregate f
227c0 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65  unction is eithe
227d0 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29  r min() or max()
227e0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68  , and.**    * th
227f0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
22800 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
22810 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  tion is a column
22820 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   value..**.** If
22830 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76   all of the abov
22840 65 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e  e are true, then
22850 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
22860 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45  IN or WHERE_ORDE
22870 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65  RBY_MAX.** is re
22880 74 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70  turned as approp
22890 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70  riate. Also, *pp
228a0 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
228b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a   point to the .*
228c0 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65  * list of argume
228d0 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  nts passed to th
228e0 65 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f  e aggregate befo
228f0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
22900 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63  .** Or, if the c
22910 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
22920 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70  are not met, *pp
22930 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f  MinMax is set to
22940 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f   0 and.** WHERE_
22950 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69  ORDERBY_NORMAL i
22960 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
22970 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51  tatic u8 minMaxQ
22980 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41  uery(AggInfo *pA
22990 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74  ggInfo, ExprList
229a0 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20   **ppMinMax){.  
229b0 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45  int eRet = WHERE
229c0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
229d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
229e0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
229f0 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20  *ppMinMax = 0;. 
22a00 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   if( pAggInfo->n
22a10 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45  Func==1 ){.    E
22a20 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67  xpr *pExpr = pAg
22a30 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
22a40 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67  pExpr; /* Aggreg
22a50 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ate function */.
22a60 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
22a70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
22a80 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41  pList;      /* A
22a90 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20  rguments to agg 
22aa0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  function */..   
22ab0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
22ac0 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
22ad0 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ION );.    if( p
22ae0 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d  EList && pEList-
22af0 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c  >nExpr==1 && pEL
22b00 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  ist->a[0].pExpr-
22b10 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
22b20 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  MN ){.      cons
22b30 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20  t char *zFunc = 
22b40 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
22b50 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
22b60 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
22b70 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
22b80 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
22b90 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a  RE_ORDERBY_MIN;.
22ba0 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
22bb0 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
22bc0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
22bd0 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
22be0 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  , "max")==0 ){. 
22bf0 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48         eRet = WH
22c00 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b  ERE_ORDERBY_MAX;
22c10 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d  .        *ppMinM
22c20 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20  ax = pEList;.   
22c30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
22c40 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e    assert( *ppMin
22c50 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69  Max==0 || (*ppMi
22c60 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20  nMax)->nExpr==1 
22c70 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74  );.  return eRet
22c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
22c90 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
22ca0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
22cb0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
22cc0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
22cd0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
22ce0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  d argument is th
22cf0 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67  e associated agg
22d00 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65  regate-info obje
22d10 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ct. This .** fun
22d20 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74  ction tests if t
22d30 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20  he SELECT is of 
22d40 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
22d50 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
22d60 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a  ) FROM <tbl>.**.
22d70 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69  ** where table i
22d80 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  s a database tab
22d90 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65  le, not a sub-se
22da0 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66  lect or view. If
22db0 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f   the query.** do
22dc0 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61  es match this pa
22dd0 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f  ttern, then a po
22de0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62  inter to the Tab
22df0 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  le object repres
22e00 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20  enting.** <tbl> 
22e10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
22e20 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74  erwise, 0 is ret
22e30 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
22e40 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65   Table *isSimple
22e50 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c  Count(Select *p,
22e60 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
22e70 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  fo){.  Table *pT
22e80 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  ab;.  Expr *pExp
22e90 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  r;..  assert( !p
22ea0 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20  ->pGroupBy );.. 
22eb0 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c   if( p->pWhere |
22ec0 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  | p->pEList->nEx
22ed0 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e  pr!=1 .   || p->
22ee0 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c  pSrc->nSrc!=1 ||
22ef0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
22f00 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20  Select.  ){.    
22f10 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
22f20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pTab = p->pSrc->
22f30 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78  a[0].pTab;.  pEx
22f40 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  pr = p->pEList->
22f50 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  a[0].pExpr;.  as
22f60 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70  sert( pTab && !p
22f70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  Tab->pSelect && 
22f80 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20  pExpr );..  if( 
22f90 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
22fa0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
22fb0 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
22fc0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72  AGG_FUNCTION ) r
22fd0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e  eturn 0;.  if( N
22fe0 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e  EVER(pAggInfo->n
22ff0 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72  Func==0) ) retur
23000 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67  n 0;.  if( (pAgg
23010 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
23020 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26  Func->funcFlags&
23030 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e  SQLITE_FUNC_COUN
23040 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  T)==0 ) return 0
23050 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66  ;.  if( pExpr->f
23060 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74  lags&EP_Distinct
23070 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
23080 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
23090 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75  /*.** If the sou
230a0 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61  rce-list item pa
230b0 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
230c0 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65  ent was augmente
230d0 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44  d with an.** IND
230e0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
230f0 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61  then try to loca
23100 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  te the specified
23110 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65   index. If there
23120 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20 63  .** was such a c
23130 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61  lause and the na
23140 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74  med index cannot
23150 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
23160 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
23170 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20  OR and leave an 
23180 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
23190 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75   Otherwise, popu
231a0 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e  late .** pFrom->
231b0 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72  pIndex and retur
231c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  n SQLITE_OK..*/.
231d0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
231e0 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65  edByLookup(Parse
231f0 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
23200 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
23210 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72  From){.  if( pFr
23220 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f  om->pTab && pFro
23230 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
23240 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
23250 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
23260 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 49  ab;.    char *zI
23270 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f 6d  ndexedBy = pFrom
23280 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79 3b  ->u1.zIndexedBy;
23290 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
232a0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
232b0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
232c0 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
232d0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
232e0 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
232f0 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20 20  edBy); .        
23300 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
23310 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
23320 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 73  !pIdx ){.      s
23330 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23340 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
23350 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64  index: %s", zInd
23360 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20 20  exedBy, 0);.    
23370 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
23380 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
23390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
233a0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
233b0 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78 20  pFrom->pIBIndex 
233c0 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
233d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
233e0 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
233f0 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
23400 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
23410 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
23420 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
23430 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
23440 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
23450 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
23460 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
23470 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
23480 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
23490 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
234a0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
234b0 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
234c0 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
234d0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
234e0 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
234f0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
23500 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
23510 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
23520 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
23530 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
23540 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
23550 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
23560 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
23570 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
23580 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
23590 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
235a0 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
235b0 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
235c0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
235d0 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
235e0 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
235f0 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
23600 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
23610 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
23620 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
23630 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
23640 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
23650 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
23660 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
23670 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
23680 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
23690 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
236a0 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
236b0 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
236c0 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
236d0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
236e0 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
236f0 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
23700 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
23710 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
23720 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
23730 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
23740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
23750 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
23760 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
23770 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
23780 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
23790 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
237a0 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
237b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
237c0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
237d0 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
237e0 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
237f0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
23800 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
23810 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
23820 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
23830 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
23840 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
23850 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
23860 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
23870 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
23880 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
23890 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
238a0 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
238b0 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
238c0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
238d0 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
238e0 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
238f0 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
23900 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
23910 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
23920 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
23930 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
23940 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
23950 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
23960 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
23970 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
23980 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
23990 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
239a0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
239b0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
239c0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
239d0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
239e0 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
239f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
23a00 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
23a10 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
23a20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
23a30 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
23a40 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
23a50 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
23a60 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
23a70 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
23a80 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
23a90 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
23aa0 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
23ab0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
23ac0 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
23ad0 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
23ae0 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
23af0 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
23b00 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
23b10 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
23b20 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 53  e3Expr(db, TK_AS
23b30 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20 70  TERISK, 0));.  p
23b40 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
23b50 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
23b60 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  0;.  pNew->pGrou
23b70 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  pBy = 0;.  pNew-
23b80 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20  >pHaving = 0;.  
23b90 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
23ba0 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20   0;.  p->pPrior 
23bb0 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  = 0;.  p->pNext 
23bc0 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68 20  = 0;.  p->pWith 
23bd0 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  = 0;.  p->selFla
23be0 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75  gs &= ~SF_Compou
23bf0 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  nd;.  assert( (p
23c00 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
23c10 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29 3b  Converted)==0 );
23c20 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
23c30 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b 0a  = SF_Converted;.
23c40 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
23c50 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70  pPrior!=0 );.  p
23c60 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  New->pPrior->pNe
23c70 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65  xt = pNew;.  pNe
23c80 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  w->pLimit = 0;. 
23c90 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
23ca0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43   0;.  return WRC
23cb0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
23cc0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
23cd0 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   if the FROM cla
23ce0 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68  use term pFrom h
23cf0 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20  as table-valued 
23d00 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75  function.** argu
23d10 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f  ments.  If it do
23d20 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  es, leave an err
23d30 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
23d40 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
23d50 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e  ** non-zero, sin
23d60 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20  ce pFrom is not 
23d70 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20  allowed to be a 
23d80 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e  table-valued fun
23d90 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
23da0 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e   int cannotBeFun
23db0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
23dc0 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
23dd0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
23de0 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66  {.  if( pFrom->f
23df0 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20  g.isTabFunc ){. 
23e00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23e10 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73 27  sg(pParse, "'%s'
23e20 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69   is not a functi
23e30 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d  on", pFrom->zNam
23e40 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
23e50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
23e60 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
23e70 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
23e80 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74  ** Argument pWit
23e90 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  h (which may be 
23ea0 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20  NULL) points to 
23eb0 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  a linked list of
23ec0 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48   nested .** WITH
23ed0 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20   contexts, from 
23ee0 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f  inner to outermo
23ef0 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  st. If the table
23f00 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a   identified by .
23f10 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  ** FROM clause e
23f20 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20  lement pItem is 
23f30 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d  really a common-
23f40 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e  table-expression
23f50 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20   (CTE) .** then 
23f60 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
23f70 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69   to the CTE defi
23f80 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nition for that 
23f90 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65  table. Otherwise
23fa0 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  .** return NULL.
23fb0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d  .**.** If a non-
23fc0 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65  NULL value is re
23fd0 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43  turned, set *ppC
23fe0 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20  ontext to point 
23ff0 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f  to the With.** o
24000 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72  bject that the r
24010 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f  eturned CTE belo
24020 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ngs to..*/.stati
24030 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65  c struct Cte *se
24040 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68  archWith(.  With
24050 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20   *pWith,        
24060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
24070 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74  urrent innermost
24080 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a   WITH clause */.
24090 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
240a0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20  _item *pItem,   
240b0 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
240c0 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f   element to reso
240d0 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a  lve */.  With **
240e0 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  ppContext       
240f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
24100 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74   WITH clause ret
24110 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67  urn value belong
24120 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  s to */.){.  con
24130 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
24140 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
24150 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e  tabase==0 && (zN
24160 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61  ame = pItem->zNa
24170 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69  me)!=0 ){.    Wi
24180 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  th *p;.    for(p
24190 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e  =pWith; p; p=p->
241a0 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69  pOuter){.      i
241b0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
241c0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20  i=0; i<p->nCte; 
241d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
241e0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
241f0 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e  (zName, p->a[i].
24200 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
24210 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78         *ppContex
24220 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  t = p;.         
24230 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d   return &p->a[i]
24240 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24250 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
24260 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
24270 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
24280 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73  or maintains a s
24290 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57  tack of active W
242a0 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77  ITH clauses.** w
242b0 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f  ith the inner-mo
242c0 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62  st WITH clause b
242d0 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20  eing at the top 
242e0 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  of the stack..**
242f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24300 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48   pushes the WITH
24310 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61   clause passed a
24320 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
24330 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68  ument.** onto th
24340 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
24350 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20  ck. If argument 
24360 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74  bFree is true, t
24370 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48  hen this.** WITH
24380 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76   clause will nev
24390 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f  er be popped fro
243a0 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20  m the stack. In 
243b0 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20  this case it.** 
243c0 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20  should be freed 
243d0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50  along with the P
243e0 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20  arse object. In 
243f0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65  other cases, whe
24400 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74  n.** bFree==0, t
24410 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77  he With object w
24420 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f  ill be freed alo
24430 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45  ng with the SELE
24440 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  CT .** statement
24450 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69   with which it i
24460 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f  s associated..*/
24470 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
24480 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61  hPush(Parse *pPa
24490 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68  rse, With *pWith
244a0 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61  , u8 bFree){.  a
244b0 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20  ssert( bFree==0 
244c0 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74  || (pParse->pWit
244d0 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  h==0 && pParse->
244e0 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20  pWithToFree==0) 
244f0 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  );.  if( pWith )
24500 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
24510 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69  arse->pWith!=pWi
24520 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d  th );.    pWith-
24530 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65  >pOuter = pParse
24540 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
24550 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
24560 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65  th;.    if( bFre
24570 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74  e ) pParse->pWit
24580 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b  hToFree = pWith;
24590 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
245a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63  is function chec
245b0 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70  ks if argument p
245c0 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61  From refers to a
245d0 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62 79   CTE declared by
245e0 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75   .** a WITH clau
245f0 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  se on the stack 
24600 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61  currently mainta
24610 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72 73  ined by the pars
24620 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63  er. And,.** if c
24630 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
24640 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65 73  ing a CTE expres
24650 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61  sion, if it is a
24660 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65   recursive.** re
24670 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
24680 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a  urrent CTE..**.*
24690 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73  * If pFrom falls
246a0 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20   into either of 
246b0 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69  the two categori
246c0 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d  es above, pFrom-
246d0 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68  >pTab.** and oth
246e0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f  er fields are po
246f0 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e  pulated accordin
24700 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  gly. The caller 
24710 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20  should check.** 
24720 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29  (pFrom->pTab!=0)
24730 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
24740 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73  ether or not a s
24750 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a  uccessful match.
24760 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a  ** was found..**
24770 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
24780 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f  ot a match is fo
24790 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  und, SQLITE_OK i
247a0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
247b0 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
247c0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  . If an error do
247d0 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72  es occur, an err
247e0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 74  or message is st
247f0 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ored in the.** p
24800 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65  arser and some e
24810 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20  rror code other 
24820 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72  than SQLITE_OK r
24830 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
24840 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e  ic int withExpan
24850 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61  d(.  Walker *pWa
24860 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20  lker, .  struct 
24870 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
24880 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a  rom.){.  Parse *
24890 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
248a0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69  ->pParse;.  sqli
248b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
248c0 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43  ->db;.  struct C
248d0 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20  te *pCte;       
248e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
248f0 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20  ed CTE (or NULL 
24900 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a  if no match) */.
24910 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20    With *pWith;  
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65    /* WITH clause
24940 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e   that pCte belon
24950 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
24960 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
24970 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20  =0 );..  pCte = 
24980 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72 73  searchWith(pPars
24990 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c  e->pWith, pFrom,
249a0 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20   &pWith);.  if( 
249b0 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c  pCte ){.    Tabl
249c0 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70  e *pTab;.    Exp
249d0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
249e0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b     Select *pSel;
249f0 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65  .    Select *pLe
24a00 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ft;             
24a10 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20     /* Left-most 
24a20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24a30 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79   */.    int bMay
24a40 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20  Recursive;      
24a50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
24a60 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64   compound joined
24a70 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20   by UNION [ALL] 
24a80 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61  */.    With *pSa
24a90 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20 20  vedWith;        
24aa0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
24ab0 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d  value of pParse-
24ac0 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f  >pWith */..    /
24ad0 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45  * If pCte->zCteE
24ae0 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61  rr is non-NULL a
24af0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
24b00 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c  en this is an il
24b10 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63  legal.    ** rec
24b20 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
24b30 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65   to CTE pCte. Le
24b40 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20  ave an error in 
24b50 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
24b60 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20  n.    ** early. 
24b70 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
24b80 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
24b90 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
24ba0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
24bb0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
24bc0 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
24bd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
24be0 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20  ->zCteErr ){.   
24bf0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
24c00 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d  sg(pParse, pCte-
24c10 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e  >zCteErr, pCte->
24c20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
24c30 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
24c40 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
24c50 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
24c60 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  n(pParse, pFrom)
24c70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
24c80 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73  _ERROR;..    ass
24c90 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
24ca0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d  ==0 );.    pFrom
24cb0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
24cc0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
24cd0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
24ce0 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20  able));.    if( 
24cf0 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
24d00 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
24d10 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20  pTab->nTabRef = 
24d20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
24d30 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
24d40 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
24d50 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
24d60 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
24d70 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
24d80 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
24d90 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
24da0 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
24db0 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61      pTab->tabFla
24dc0 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72  gs |= TF_Ephemer
24dd0 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c  al | TF_NoVisibl
24de0 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f  eRowid;.    pFro
24df0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
24e00 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
24e10 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c  , pCte->pSelect,
24e20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d   0);.    if( db-
24e30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
24e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
24e50 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  MEM_BKPT;.    as
24e60 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
24e70 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  lect );..    /* 
24e80 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73  Check if this is
24e90 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
24ea0 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20  . */.    pSel = 
24eb0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
24ec0 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76      bMayRecursiv
24ed0 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d  e = ( pSel->op==
24ee0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e  TK_ALL || pSel->
24ef0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
24f00 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
24f10 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
24f20 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c  nt i;.      SrcL
24f30 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f  ist *pSrc = pFro
24f40 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
24f50 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
24f60 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69   i<pSrc->nSrc; i
24f70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
24f80 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
24f90 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
24fa0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  >a[i];.        i
24fb0 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  f( pItem->zDatab
24fc0 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ase==0 .        
24fd0 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65   && pItem->zName
24fe0 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
24ff0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
25000 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  mp(pItem->zName,
25010 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20   pCte->zName).  
25020 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
25030 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
25040 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
25050 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52     pItem->fg.isR
25060 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20  ecursive = 1;.  
25070 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54          pTab->nT
25080 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  abRef++;.       
25090 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67     pSel->selFlag
250a0 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76  s |= SF_Recursiv
250b0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
250c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
250d0 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75  /* Only one recu
250e0 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20  rsive reference 
250f0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f  is permitted. */
25100 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e   .    if( pTab->
25110 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20  nTabRef>2 ){.   
25120 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
25130 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  sg(.          pP
25140 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20  arse, "multiple 
25150 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65  references to re
25160 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25  cursive table: %
25170 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a  s", pCte->zName.
25180 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
25190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
251a0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OR;.    }.    as
251b0 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62  sert( pTab->nTab
251c0 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c  Ref==1 || ((pSel
251d0 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65  ->selFlags&SF_Re
251e0 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62  cursive) && pTab
251f0 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b  ->nTabRef==2 ));
25200 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  ..    pCte->zCte
25210 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
25220 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
25230 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
25240 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
25250 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
25260 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
25270 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
25280 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
25290 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d   *pPrior = pSel-
252a0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61  >pPrior;.      a
252b0 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
252c0 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  With==0 );.     
252d0 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
252e0 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20   pSel->pWith;.  
252f0 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
25300 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
25310 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50  Prior);.      pP
25320 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b  rior->pWith = 0;
25330 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25340 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
25350 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
25360 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  l);.    }.    pP
25370 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
25380 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  ith;..    for(pL
25390 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d  eft=pSel; pLeft-
253a0 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70  >pPrior; pLeft=p
253b0 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  Left->pPrior);. 
253c0 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66     pEList = pLef
253d0 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t->pEList;.    i
253e0 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29  f( pCte->pCols )
253f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
25400 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
25410 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr!=pCte->pCols
25420 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
25430 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
25440 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
25450 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75  e %s has %d valu
25460 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
25470 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
25480 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c  pCte->zName, pEL
25490 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65  ist->nExpr, pCte
254a0 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20  ->pCols->nExpr. 
254b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
254c0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
254d0 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
254e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
254f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
25500 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
25510 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
25520 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
25530 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
25540 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
25550 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
25560 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
25570 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
25580 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
25590 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67  f( pSel->selFlag
255a0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
255b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65   ){.        pCte
255c0 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c  ->zCteErr = "mul
255d0 74 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20  tiple recursive 
255e0 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b  references: %s";
255f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25600 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65        pCte->zCte
25610 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65  Err = "recursive
25620 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
25630 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20  subquery: %s";. 
25640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
25650 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
25660 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
25670 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a     }.    pCte->z
25680 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
25690 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
256a0 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a  pSavedWith;.  }.
256b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
256c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
256d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
256e0 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20  IT_CTE./*.** If 
256f0 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65  the SELECT passe
25700 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
25710 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20  argument has an 
25720 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20  associated WITH 
25730 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20  .** clause, pop 
25740 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  it from the stac
25750 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  k stored as part
25760 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62   of the Parse ob
25770 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
25780 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
25790 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74  d as the xSelect
257a0 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c  Callback2() call
257b0 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74  back by.** sqlit
257c0 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
257d0 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20   when walking a 
257e0 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72  SELECT tree to r
257f0 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20  esolve table.** 
25800 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20  names and other 
25810 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
25820 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ents. .*/.static
25830 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57   void selectPopW
25840 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ith(Walker *pWal
25850 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
25860 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
25870 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
25880 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  se;.  if( pParse
25890 2d 3e 70 57 69 74 68 20 26 26 20 70 2d 3e 70 50  ->pWith && p->pP
258a0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57  rior==0 ){.    W
258b0 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e  ith *pWith = fin
258c0 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
258d0 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57  With;.    if( pW
258e0 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ith!=0 ){.      
258f0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
25900 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a  pWith==pWith );.
25910 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57        pParse->pW
25920 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75  ith = pWith->pOu
25930 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ter;.    }.  }.}
25940 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73  .#else.#define s
25950 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23  electPopWith 0.#
25960 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
25970 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57  s routine is a W
25980 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
25990 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61  or "expanding" a
259a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
259b0 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67  t..** "Expanding
259c0 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68  " means to do th
259d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
259e0 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20  **    (1)  Make 
259f0 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f 72  sure VDBE cursor
25a00 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
25a10 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65  en assigned to e
25a20 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  very.**         
25a30 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46  element of the F
25a40 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ROM clause..**.*
25a50 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69  *    (2)  Fill i
25a60 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e  n the pTabList->
25a70 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20  a[].pTab fields 
25a80 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20 74  in the SrcList t
25a90 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  hat .**         
25aa0 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61  defines FROM cla
25ab0 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73  use.  When views
25ac0 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 46   appear in the F
25ad0 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20  ROM clause,.**  
25ae0 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62         fill pTab
25af0 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63  List->a[].pSelec
25b00 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  t with a copy of
25b10 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
25b20 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  ement.**        
25b30 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
25b40 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f   the view.  A co
25b50 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68  py is made of th
25b60 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a  e view's SELECT.
25b70 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74 65  **         state
25b80 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20  ment so that we 
25b90 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66  can freely modif
25ba0 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74  y or delete that
25bb0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20   statement.**   
25bc0 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f        without wo
25bd0 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73  rrying about mes
25be0 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72 73  sing up the pers
25bf0 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74  istent represent
25c00 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20  ation.**        
25c10 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a   of the view..**
25c20 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64 20  .**    (3)  Add 
25c30 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45  terms to the WHE
25c40 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63  RE clause to acc
25c50 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  ommodate the NAT
25c60 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
25c70 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
25c80 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
25c90 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
25ca0 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
25cb0 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
25cc0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
25cd0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
25ce0 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
25cf0 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
25d00 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
25d10 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
25d20 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
25d30 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
25d40 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
25d50 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
25d60 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
25d70 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
25d80 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
25d90 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
25da0 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
25db0 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
25dc0 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  nt selectExpande
25dd0 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
25de0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
25df0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
25e00 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
25e10 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
25e20 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
25e30 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
25e40 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
25e50 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
25e60 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
25e70 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
25e80 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20  db;.  Expr *pE, 
25e90 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b  *pRight, *pExpr;
25ea0 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20  .  u16 selFlags 
25eb0 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a  = p->selFlags;..
25ec0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
25ed0 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
25ee0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
25ef0 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
25f00 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
25f10 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
25f20 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73  ->pSrc==0) || (s
25f30 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
25f40 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
25f50 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
25f60 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  e;.  }.  pTabLis
25f70 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
25f80 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
25f90 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 74  t;.  if( p->pWit
25fa0 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
25fb0 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65 2c  WithPush(pParse,
25fc0 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a 20   p->pWith, 0);. 
25fd0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
25fe0 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  re cursor number
25ff0 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73 69  s have been assi
26000 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72  gned to all entr
26010 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ies in.  ** the 
26020 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
26030 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
26040 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ent..  */.  sqli
26050 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
26060 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
26070 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a  pTabList);..  /*
26080 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20 74   Look up every t
26090 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  able named in th
260a0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
260b0 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49 66   the select.  If
260c0 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f  .  ** an entry o
260d0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
260e0 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  e is a subquery 
260f0 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61 62  instead of a tab
26100 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a  le or view,.  **
26110 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 74   then create a t
26120 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73  ransient table s
26130 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73 63  tructure to desc
26140 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65 72  ribe the subquer
26150 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
26160 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
26170 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
26180 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
26190 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  om++){.    Table
261a0 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65   *pTab;.    asse
261b0 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  rt( pFrom->fg.is
261c0 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
261d0 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29  pFrom->pTab!=0 )
261e0 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
261f0 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
26200 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26210 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
26220 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  Tab==0 );.#ifnde
26230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
26240 45 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78  E.    if( withEx
26250 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46  pand(pWalker, pF
26260 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52  rom) ) return WR
26270 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28  C_Abort;.    if(
26280 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b   pFrom->pTab ) {
26290 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20  } else.#endif.  
262a0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61    if( pFrom->zNa
262b0 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66  me==0 ){.#ifndef
262c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
262d0 51 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65  QUERY.      Sele
262e0 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
262f0 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
26300 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20   /* A sub-query 
26310 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
26320 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a  se of a SELECT *
26330 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
26340 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  pSel!=0 );.     
26350 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
26360 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20  pTab==0 );.     
26370 20 69 66 28 20 73 71 6c 69 74 65 33 57 61 6c 6b   if( sqlite3Walk
26380 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
26390 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e 20 57  pSel) ) return W
263a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
263b0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
263c0 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
263d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
263e0 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
263f0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
26400 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26410 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  t;.      pTab->n
26420 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  TabRef = 1;.    
26430 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
26440 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
26450 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70  b, "sqlite_sq_%p
26460 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
26470 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
26480 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
26490 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
264a0 72 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74  r; }.      sqlit
264b0 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  e3ColumnsFromExp
264c0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
264d0 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62  el->pEList,&pTab
264e0 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43  ->nCol,&pTab->aC
264f0 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
26500 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
26510 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67     pTab->nRowLog
26520 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72  Est = 200; asser
26530 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c  t( 200==sqlite3L
26540 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29  ogEst(1048576) )
26550 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
26560 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
26570 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
26580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26590 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
265a0 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
265b0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
265c0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
265d0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
265e0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
265f0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
26600 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
26610 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
26620 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
26630 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
26640 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
26650 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
26660 62 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66  b->nTabRef>=0xff
26670 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ff ){.        sq
26680 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
26690 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
266a0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22  references to \"
266b0 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22  %s\": max 65535"
266c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61  ,.           pTa
266d0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
266e0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
266f0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
26700 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26710 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62      }.      pTab
26720 2d 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20  ->nTabRef++;.   
26730 20 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61     if( !IsVirtua
26740 6c 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f  l(pTab) && canno
26750 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  tBeFunction(pPar
26760 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
26770 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
26780 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
26790 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
267a0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
267b0 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49  | !defined (SQLI
267c0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
267d0 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20  ABLE).      if( 
267e0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
267f0 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
26800 20 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20   ){.        i16 
26810 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  nCol;.        if
26820 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  ( sqlite3ViewGet
26830 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
26840 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75  se, pTab) ) retu
26850 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26860 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
26870 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  rom->pSelect==0 
26880 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
26890 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
268a0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
268b0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20   pTab->pSelect, 
268c0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
268d0 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
268e0 28 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pFrom->pSelect,
268f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
26900 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54         nCol = pT
26910 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
26920 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d    pTab->nCol = -
26930 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
26940 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
26950 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65  lker, pFrom->pSe
26960 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  lect);.        p
26970 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  Tab->nCol = nCol
26980 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
26990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
269a0 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
269b0 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44  named by the IND
269c0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
269d0 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69  if any. */.    i
269e0 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65  f( sqlite3Indexe
269f0 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  dByLookup(pParse
26a00 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
26a10 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
26a20 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rt;.    }.  }.. 
26a30 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55   /* Process NATU
26a40 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e  RAL keywords, an
26a50 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  d ON and USING c
26a60 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e  lauses of joins.
26a70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
26a80 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
26a90 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69  sqliteProcessJoi
26aa0 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a  n(pParse, p) ){.
26ab0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
26ac0 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  bort;.  }..  /* 
26ad0 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68  For every "*" th
26ae0 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  at occurs in the
26af0 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e   column list, in
26b00 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f  sert the names o
26b10 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d  f.  ** all colum
26b20 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
26b30 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79  .  And for every
26b40 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20   TABLE.* insert 
26b50 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f  the names.  ** o
26b60 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
26b70 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72   TABLE.  The par
26b80 73 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73  ser inserted a s
26b90 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
26ba0 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20  n.  ** with the 
26bb0 54 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72  TK_ASTERISK oper
26bc0 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a  ator for each "*
26bd0 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20  " that it found 
26be0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  in the column.  
26bf0 2a 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f  ** list.  The fo
26c00 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73  llowing code jus
26c10 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20  t has to locate 
26c20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a  the TK_ASTERISK.
26c30 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
26c40 20 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68   and expand each
26c50 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74   one to the list
26c60 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
26c70 69 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c  in.  ** all tabl
26c80 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  es..  **.  ** Th
26c90 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73  e first loop jus
26ca0 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  t checks to see 
26cb0 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
26cc0 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20   "*" operators. 
26cd0 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78   ** that need ex
26ce0 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  panding..  */.  
26cf0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
26d00 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
26d10 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d      pE = pEList-
26d20 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[k].pExpr;.   
26d30 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
26d40 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
26d50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
26d60 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20  ->op!=TK_DOT || 
26d70 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pE->pRight!=0 );
26d80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
26d90 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28  >op!=TK_DOT || (
26da0 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20  pE->pLeft!=0 && 
26db0 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  pE->pLeft->op==T
26dc0 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28  K_ID) );.    if(
26dd0 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20   pE->op==TK_DOT 
26de0 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f  && pE->pRight->o
26df0 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29  p==TK_ASTERISK )
26e00 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
26e10 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ( k<pEList->nExp
26e20 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r ){.    /*.    
26e30 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72  ** If we get her
26e40 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72  e it means the r
26e50 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69  esult set contai
26e60 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  ns one or more "
26e70 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  *".    ** operat
26e80 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
26e90 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c   be expanded.  L
26ea0 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
26eb0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
26ec0 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
26ed0 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20   set and expand 
26ee0 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e  them one by one.
26ef0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75  .    */.    stru
26f00 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
26f10 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b   *a = pEList->a;
26f20 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
26f30 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  New = 0;.    int
26f40 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d   flags = pParse-
26f50 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  >db->flags;.    
26f60 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20  int longNames = 
26f70 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
26f80 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  FullColNames)!=0
26f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26fa0 20 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73         && (flags
26fb0 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
26fc0 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20  olNames)==0;..  
26fd0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
26fe0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
26ff0 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61 5b 6b  {.      pE = a[k
27000 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ].pExpr;.      p
27010 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52 69 67  Right = pE->pRig
27020 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ht;.      assert
27030 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54  ( pE->op!=TK_DOT
27040 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20 29 3b   || pRight!=0 );
27050 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  .      if( pE->o
27060 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  p!=TK_ASTERISK. 
27070 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e 6f 70        && (pE->op
27080 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
27090 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52  ht->op!=TK_ASTER
270a0 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  ISK).      ){.  
270b0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
270c0 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
270d0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
270e0 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
270f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
27100 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
27110 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
27120 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
27130 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
27140 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
27150 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
27160 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
27170 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
27180 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
27190 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
271a0 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
271b0 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
271c0 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
271d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
271e0 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
271f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27200 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
27210 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27220 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
27230 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
27240 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
27250 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
27260 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
27270 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
27280 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
27290 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
272a0 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
272b0 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
272c0 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
272d0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
272e0 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
272f0 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
27300 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
27310 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
27320 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
27330 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
27340 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
27350 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
27360 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
27370 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
27380 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
27390 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
273a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
273b0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
273c0 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
273d0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
273e0 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
273f0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
27400 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
27410 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
27420 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
27430 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
27440 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
27450 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
27460 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
27470 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
27480 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
27490 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
274a0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
274b0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
274c0 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
274d0 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
274e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
274f0 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
27500 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
27510 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
27520 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
27530 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
27540 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
27550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
27560 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
27570 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
27580 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
27590 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
275a0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
275b0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
275c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
275d0 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
275e0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
275f0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
27600 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
27610 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
27620 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
27630 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e  ->aDb[iDb].zDbSN
27640 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20  ame : "*";.     
27650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
27660 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62   for(j=0; j<pTab
27670 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
27680 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
27690 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43  zName = pTab->aC
276a0 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
276b0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
276c0 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65  Colname;  /* The
276d0 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   computed column
276e0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
276f0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72       char *zToFr
27700 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65  ee;   /* Malloce
27710 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65  d string that ne
27720 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
27730 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 54  */.            T
27740 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20  oken sColname;  
27750 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75  /* Computed colu
27760 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b  mn name as a tok
27770 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20  en */..         
27780 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
27790 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
277a0 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53  if( zTName && pS
277b0 75 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ub.             
277c0 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  && sqlite3MatchS
277d0 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45  panName(pSub->pE
277e0 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e  List->a[j].zSpan
277f0 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d  , 0, zTName, 0)=
27800 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 29  =0.            )
27810 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27820 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
27830 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
27840 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
27850 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
27860 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69 74 20   'hidden', omit 
27870 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78 70 61  it from the expa
27880 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  nded.           
27890 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 6c   ** result-set l
278a0 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65 20 53  ist unless the S
278b0 45 4c 45 43 54 20 68 61 73 20 74 68 65 20 53 46  ELECT has the SF
278c0 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 0a 20  _IncludeHidden. 
278d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 69             ** bi
278e0 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20 20 20  t set..         
278f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
27900 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
27910 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64 65 48  gs & SF_IncludeH
27920 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20 20 20  idden)==0.      
27930 20 20 20 20 20 20 20 26 26 20 49 73 48 69 64 64         && IsHidd
27940 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e  enColumn(&pTab->
27950 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20 20 20  aCol[j]) .      
27960 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27970 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
27980 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27990 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
279a0 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
279b0 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
279c0 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
279e0 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pFrom->fg.join
279f0 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
27a00 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  L)!=0.          
27a10 20 20 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e        && tableAn
27a20 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61  dColumnIndex(pTa
27a30 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c  bList, i, zName,
27a40 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20   0, 0).         
27a50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27a60 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
27a70 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d  NATURAL join, om
27a80 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75  it the join colu
27a90 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  mns from the .  
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
27ab0 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69   table to the ri
27ac0 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ght of the join 
27ad0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
27ae0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
27af0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27b00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
27b10 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
27b20 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c  x(pFrom->pUsing,
27b30 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20   zName)>=0 ){.  
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27b50 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20   In a join with 
27b60 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20  a USING clause, 
27b70 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  omit columns in 
27b80 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
27b90 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61      ** using cla
27ba0 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62  use from the tab
27bb0 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  le on the right.
27bc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
27bd0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
27be0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27c00 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
27c10 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
27c20 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a   TK_ID, zName);.
27c30 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c              zCol
27c40 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  name = zName;.  
27c50 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
27c60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
27c70 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
27c80 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
27c90 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
27ca0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
27cb0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
27cc0 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
27cd0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
27ce0 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zTabName);.     
27cf0 20 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d           pExpr =
27d00 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
27d10 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
27d20 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  eft, pRight);.  
27d30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27d40 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
27d60 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
27d70 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
27d80 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
27d90 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
27da0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
27db0 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
27dc0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29 3b 0a   pLeft, pExpr);.
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
27df0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20  ( longNames ){. 
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
27e10 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  Colname = sqlite
27e20 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
27e30 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
27e40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
27e50 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
27e60 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20  = zColname;.    
27e70 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27e80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
27ea0 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  pr = pRight;.   
27eb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27ec0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
27ed0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
27ee0 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
27ef0 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
27f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
27f10 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61 6d 65  enInit(&sColname
27f20 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
27f30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27f40 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
27f50 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73  pParse, pNew, &s
27f60 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  Colname, 0);.   
27f70 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
27f80 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  w && (p->selFlag
27f90 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
27fa0 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)!=0 ){.       
27fb0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
27fc0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 58 20  prList_item *pX 
27fd0 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d  = &pNew->a[pNew-
27fe0 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20  >nExpr-1];.     
27ff0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
28000 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  b ){.           
28010 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
28020 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
28030 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  (db, pSub->pELis
28040 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[j].zSpan);.
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53  testcase( pX->zS
28070 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pan==0 );.      
28080 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
280a0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
280b0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
280c0 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20 20 20  s.%s.%s",.      
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280f0 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65       zSchemaName
28100 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c  , zTabName, zCol
28110 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
28120 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28130 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
28140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
28150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
28160 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20 3d 20  X->bSpanIsTab = 
28170 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
28180 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28190 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
281a0 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  ToFree);.       
281b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
281c0 20 20 20 20 20 20 20 69 66 28 20 21 74 61 62 6c         if( !tabl
281d0 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  eSeen ){.       
281e0 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b     if( zTName ){
281f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28200 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28210 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  rse, "no such ta
28220 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65  ble: %s", zTName
28230 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
28240 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
28250 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28260 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c  pParse, "no tabl
28270 65 73 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  es specified");.
28280 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28290 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
282a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
282b0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
282c0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
282d0 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b  ->pEList = pNew;
282e0 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
282f0 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
28300 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 2d   p->pEList && p-
28310 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64  >pEList->nExpr>d
28320 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
28330 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
28340 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
28350 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
28360 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
28370 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b  in result set");
28380 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
28390 41 62 6f 72 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  Abort;.  }.#endi
283a0 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  f.  return WRC_C
283b0 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
283c0 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20  * No-op routine 
283d0 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74 72  for the parse-tr
283e0 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a  ee walker..**.**
283f0 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
28400 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72  ne is the Walker
28410 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
28420 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  hen expression t
28430 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b  rees.** are walk
28440 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61  ed without any a
28450 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b  ctions being tak
28460 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e  en at each node.
28470 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a    Presumably,.**
28480 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
28490 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 57  ne is used for W
284a0 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
284b0 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c  ack then .** Wal
284c0 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
284d0 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f  ack is set to do
284e0 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75   something usefu
284f0 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20  l for every .** 
28500 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65 20  subquery in the 
28510 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a  parser tree..*/.
28520 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 57  int sqlite3ExprW
28530 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
28540 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e  NotUsed, Expr *N
28550 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
28560 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
28570 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
28580 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
28590 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
285a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 22  * This routine "
285b0 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45 43  expands" a SELEC
285c0 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  T statement and 
285d0 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71 75  all of its subqu
285e0 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64  eries..** For ad
285f0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
28600 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74 20  tion on what it 
28610 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e 64  means to "expand
28620 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  " a SELECT.** st
28630 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68 65  atement, see the
28640 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
28650 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f 72  selectExpand wor
28660 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f  ker callback abo
28670 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64  ve..**.** Expand
28680 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74 61  ing a SELECT sta
28690 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  tement is the fi
286a0 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f 63  rst step in proc
286b0 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45  essing a.** SELE
286c0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  CT statement.  T
286d0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
286e0 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70 61  ent must be expa
286f0 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e  nded before.** n
28700 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  ame resolution i
28710 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a  s performed..**.
28720 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20 67  ** If anything g
28730 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72  oes wrong, an er
28740 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 77  ror message is w
28750 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61 72  ritten into pPar
28760 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  se..** The calli
28770 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ng function can 
28780 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62 6c  detect the probl
28790 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  em by looking at
287a0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a   pParse->nErr.**
287b0 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e   and/or pParse->
287c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
287d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
287e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
287f0 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61 72  pand(Parse *pPar
28800 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  se, Select *pSel
28810 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  ect){.  Walker w
28820 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
28830 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
28840 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
28850 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  = sqlite3ExprWal
28860 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
28870 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
28880 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d  ( pParse->hasCom
28890 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78  pound ){.    w.x
288a0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
288b0 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
288c0 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
288d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
288e0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
288f0 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
28900 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
28910 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
28920 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
28930 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
28940 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57  With;.  sqlite3W
28950 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
28960 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
28970 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28980 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
28990 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
289a0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
289b0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
289c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
289d0 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
289e0 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
289f0 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
28a00 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
28a10 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
28a20 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
28a30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
28a40 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
28a50 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
28a60 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
28a70 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
28a80 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
28a90 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
28aa0 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
28ab0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
28ac0 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
28ad0 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
28ae0 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
28af0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
28b00 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
28b10 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
28b20 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
28b30 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
28b40 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
28b50 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
28b60 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
28b70 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
28b80 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
28b90 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
28ba0 64 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  d selectAddSubqu
28bb0 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
28bc0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
28bd0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
28be0 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
28bf0 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
28c00 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
28c10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
28c20 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
28c30 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
28c40 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
28c50 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
28c60 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
28c70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b 0a 20 20 70  eInfo)==0 );.  p
28c80 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
28c90 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20  _HasTypeInfo;.  
28ca0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
28cb0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62  ->pParse;.  pTab
28cc0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
28cd0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
28ce0 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
28cf0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
28d00 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
28d10 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
28d20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
28d30 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
28d40 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  0 );.    if( (pT
28d50 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
28d60 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
28d70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ){.      /* A su
28d80 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
28d90 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
28da0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
28db0 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
28dc0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
28dd0 20 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b       if( pSel ){
28de0 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
28df0 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70  pSel->pPrior ) p
28e00 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  Sel = pSel->pPri
28e10 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  or;.        sqli
28e20 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75  te3SelectAddColu
28e30 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
28e40 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
28e50 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a   pSel);.      }.
28e60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
28e70 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
28e80 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
28e90 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
28ea0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
28eb0 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
28ec0 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
28ed0 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
28ee0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
28ef0 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
28f00 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
28f10 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
28f20 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
28f30 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
28f40 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
28f50 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
28f60 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
28f70 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
28f80 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
28f90 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
28fa0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
28fb0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
28fc0 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c  of(w));.  w.xSel
28fd0 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
28fe0 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
28ff0 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
29000 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  xprCallback = sq
29010 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
29020 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
29030 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
29040 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
29050 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
29060 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
29070 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20  routine sets up 
29080 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
29090 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
290a0 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
290b0 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
290c0 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
290d0 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
290e0 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
290f0 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
29100 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
29110 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
29120 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
29130 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
29140 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
29150 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
29160 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
29170 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
29180 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
29190 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
291a0 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
291b0 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
291c0 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
291d0 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
291e0 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
291f0 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
29200 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
29210 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
29220 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
29230 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
29240 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
29250 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
29260 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
29270 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
29280 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
29290 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
292a0 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
292b0 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
292c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
292d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
292e0 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
292f0 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
29300 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
29310 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
29320 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
29330 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
29340 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
29350 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
29360 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
29370 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
29380 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
29390 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
293a0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
293b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
293c0 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
293d0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69  (pParse, p);.  i
293e0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
293f0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
29400 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
29410 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
29420 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
29430 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
29440 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
29450 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
29460 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
29470 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
29480 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72  AddTypeInfo(pPar
29490 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  se, p);.}../*.**
294a0 20 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65   Reset the aggre
294b0 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
294c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72  ..**.** The aggr
294d0 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
294e0 72 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65  r is a set of me
294f0 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20  mory cells that 
29500 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64  hold.** intermed
29510 69 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69  iate results whi
29520 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61  le calculating a
29530 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68  n aggregate.  Th
29540 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  is.** routine ge
29550 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61  nerates code tha
29560 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69  t stores NULLs i
29570 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d  n all of those m
29580 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a  emory.** cells..
29590 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
295a0 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
295b0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
295c0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
295d0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
295e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
295f0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
29600 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46  AggInfo_func *pF
29610 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20  unc;.  int nReg 
29620 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  = pAggInfo->nFun
29630 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  c + pAggInfo->nC
29640 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65  olumn;.  if( nRe
29650 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23  g==0 ) return;.#
29660 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
29670 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
29680 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20  hat all AggInfo 
29690 72 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69  registers are wi
296a0 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73  thin the range s
296b0 70 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a  pecified by.  **
296c0 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e   AggInfo.mnReg..
296d0 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f  AggInfo.mxReg */
296e0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d  .  assert( nReg=
296f0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
29700 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  -pAggInfo->mnReg
29710 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  +1 );.  for(i=0;
29720 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   i<pAggInfo->nCo
29730 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
29740 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
29750 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d  ->aCol[i].iMem>=
29760 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a  pAggInfo->mnReg.
29770 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67           && pAgg
29780 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
29790 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  em<=pAggInfo->mx
297a0 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  Reg );.  }.  for
297b0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
297c0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20  ->nFunc; i++){. 
297d0 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49     assert( pAggI
297e0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d  nfo->aFunc[i].iM
297f0 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
29800 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
29810 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
29820 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
29830 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
29840 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
29850 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
29860 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e  _Null, 0, pAggIn
29870 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49  fo->mnReg, pAggI
29880 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66  nfo->mxReg);.  f
29890 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66  or(pFunc=pAggInf
298a0 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69  o->aFunc, i=0; i
298b0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
298c0 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b  ; i++, pFunc++){
298d0 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e  .    if( pFunc->
298e0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
298f0 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
29900 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20   pFunc->pExpr;. 
29910 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
29920 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
29930 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
29940 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
29950 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  >x.pList==0 || p
29960 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  E->x.pList->nExp
29970 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  r!=1 ){.        
29980 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
29990 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
299a0 54 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73  T aggregates mus
299b0 74 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f  t have exactly o
299c0 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ne ".           
299d0 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20  "argument");.   
299e0 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73       pFunc->iDis
299f0 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20  tinct = -1;.    
29a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29a10 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
29a20 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
29a30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
29a40 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c   pE->x.pList, 0,
29a50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
29a60 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
29a70 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
29a80 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74  al, pFunc->iDist
29a90 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  inct, 0, 0,.    
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ab0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
29ac0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
29ad0 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  O);.      }.    
29ae0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
29af0 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67  nvoke the OP_Agg
29b00 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20  Finalize opcode 
29b10 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67  for every aggreg
29b20 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
29b30 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  in the AggInfo s
29b40 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
29b50 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a  tic void finaliz
29b60 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61  eAggFunctions(Pa
29b70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
29b80 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
29b90 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
29ba0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
29bb0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
29bc0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
29bd0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
29be0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
29bf0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
29c00 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
29c10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
29c20 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
29c30 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
29c40 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
29c50 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
29c60 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
29c70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29c80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
29c90 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c  Final, pF->iMem,
29ca0 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
29cb0 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
29cc0 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e  sqlite3VdbeAppen
29cd0 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63  dP4(v, pF->pFunc
29ce0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
29cf0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
29d00 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
29d10 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
29d20 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
29d30 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
29d40 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
29d50 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
29d60 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
29d70 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
29d80 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
29d90 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
29da0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
29db0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
29dc0 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
29dd0 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
29de0 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
29df0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
29e00 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
29e10 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
29e20 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
29e30 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
29e40 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
29e50 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
29e60 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
29e70 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
29e80 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
29e90 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
29ea0 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
29eb0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
29ec0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
29ed0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
29ee0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
29ef0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
29f00 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
29f10 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
29f20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
29f30 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
29f40 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
29f50 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
29f60 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
29f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29f80 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
29f90 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
29fa0 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45  Agg, 0, SQLITE_E
29fb0 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
29fc0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
29fd0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
29fe0 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
29ff0 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
2a000 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
2a010 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
2a020 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2a030 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2a040 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f  e( nArg==0 );  /
2a050 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  * Error conditio
2a060 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  n */.      testc
2a070 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20  ase( nArg>1 );  
2a080 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f   /* Also an erro
2a090 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44  r */.      codeD
2a0a0 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
2a0b0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61  pF->iDistinct, a
2a0c0 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41  ddrNext, 1, regA
2a0d0 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gg);.    }.    i
2a0e0 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75  f( pF->pFunc->fu
2a0f0 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
2a100 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29  _FUNC_NEEDCOLL )
2a110 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
2a120 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20  *pColl = 0;.    
2a130 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2a140 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2a150 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
2a160 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21    assert( pList!
2a170 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21  =0 );  /* pList!
2a180 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20  =0 if pF->pFunc 
2a190 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a  has NEEDCOLL */.
2a1a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70        for(j=0, p
2a1b0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21  Item=pList->a; !
2a1c0 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b  pColl && j<nArg;
2a1d0 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   j++, pItem++){.
2a1e0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2a1f0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
2a200 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
2a210 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
2a220 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f  }.      if( !pCo
2a230 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ll ){.        pC
2a240 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
2a250 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
2a260 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2a270 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
2a280 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2a290 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b  or ) regHit = ++
2a2a0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2a2b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a2c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c  ddOp4(v, OP_Coll
2a2d0 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20  Seq, regHit, 0, 
2a2e0 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
2a2f0 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
2a300 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2a310 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2a320 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65  _AggStep0, 0, re
2a330 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b  gAgg, pF->iMem);
2a340 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2a350 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e  AppendP4(v, pF->
2a360 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
2a370 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
2a380 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28  dbeChangeP5(v, (
2a390 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71  u8)nArg);.    sq
2a3a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
2a3b0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
2a3c0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2a3d0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  g);.    sqlite3R
2a3e0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2a3f0 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20  pParse, regAgg, 
2a400 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61  nArg);.    if( a
2a410 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ddrNext ){.     
2a420 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2a430 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2a440 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Next);.      sql
2a450 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2a460 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ar(pParse);.    
2a470 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  }.  }..  /* Befo
2a480 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68  re populating th
2a490 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
2a4a0 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74  gisters, clear t
2a4b0 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e  he column cache.
2a4c0 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
2a4d0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72   if any of the r
2a4e0 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76  equired column v
2a4f0 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64  alues are alread
2a500 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20  y present .  ** 
2a510 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71  in registers, sq
2a520 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20  lite3ExprCode() 
2a530 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79  may use OP_SCopy
2a540 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c   to copy the val
2a550 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69  ue.  ** to pC->i
2a560 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20  Mem. But by the 
2a570 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69  time the value i
2a580 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67  s used, the orig
2a590 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20  inal register.  
2a5a0 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ** may have been
2a5b0 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74   used, invalidat
2a5c0 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ing the underlyi
2a5d0 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e  ng buffer holdin
2a5e0 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20  g the.  ** text 
2a5f0 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53  or blob value. S
2a600 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33  ee ticket [88303
2a610 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  4dcb5]..  **.  *
2a620 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69  * Another soluti
2a630 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63  on would be to c
2a640 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f  hange the OP_SCo
2a650 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  py used to copy 
2a660 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75  cached.  ** valu
2a670 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79  es to an OP_Copy
2a680 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67  ..  */.  if( reg
2a690 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48  Hit ){.    addrH
2a6a0 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33  itTest = sqlite3
2a6b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2a6c0 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64  _If, regHit); Vd
2a6d0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2a6e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
2a6f0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2a700 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
2a710 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
2a720 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
2a730 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
2a740 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
2a750 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
2a760 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
2a770 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
2a780 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2a790 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
2a7a0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
2a7b0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
2a7c0 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
2a7d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2a7e0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
2a7f0 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
2a800 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
2a810 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
2a820 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
2a830 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
2a840 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
2a850 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
2a860 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
2a870 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
2a880 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2a890 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
2a8a0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
2a8b0 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
2a8c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a8e0 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
2a8f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
2a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a910 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
2a920 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
2a930 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
2a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a950 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
2a960 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
2a970 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
2a980 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
2a990 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  n==2 ){.    int 
2a9a0 62 43 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d  bCover = (pIdx!=
2a9b0 30 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70  0 && (HasRowid(p
2a9c0 54 61 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61  Tab) || !IsPrima
2a9d0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
2a9e0 29 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ));.    char *zE
2a9f0 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  qp = sqlite3MPri
2aa00 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
2aa10 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
2aa20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
2aa30 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
2aa40 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
2aa50 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
2aa60 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
2aa70 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
2aa80 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
2aa90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2aaa0 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
2aab0 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c    pParse->pVdbe,
2aac0 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
2aad0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
2aae0 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44  0, 0, zEqp, P4_D
2aaf0 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20  YNAMIC.    );.  
2ab00 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
2ab10 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  ne explainSimple
2ab20 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e  Count(a,b,c).#en
2ab30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
2ab40 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
2ab50 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2ab60 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
2ab70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
2ab80 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
2ab90 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
2aba0 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
2abb0 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
2abc0 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
2abd0 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
2abe0 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
2abf0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
2ac00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2ac10 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
2ac20 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
2ac30 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
2ac40 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
2ac50 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
2ac60 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
2ac70 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
2ac80 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
2ac90 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2aca0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
2acb0 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
2acc0 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
2acd0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
2ace0 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
2acf0 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
2ad00 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
2ad10 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2ad20 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
2ad30 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
2ad40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad60 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
2ad70 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
2ad80 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
2ad90 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
2ada0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
2adb0 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
2adc0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
2add0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
2ade0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2adf0 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
2ae00 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
2ae10 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
2ae20 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2ae30 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ae50 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
2ae60 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
2ae70 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
2ae80 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
2ae90 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2aea0 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
2aeb0 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
2aec0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2aed0 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74  st = 0;  /* List
2aee0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
2aef0 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
2af00 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
2af10 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
2af20 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
2af30 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
2af40 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
2af50 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
2af60 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2af70 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
2af80 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
2af90 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
2afa0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
2afb0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
2afc0 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
2afd0 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
2afe0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
2aff0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
2b000 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
2b010 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
2b020 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
2b030 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
2b040 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
2b050 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
2b060 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
2b070 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
2b080 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
2b090 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
2b0a0 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
2b0b0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
2b0c0 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
2b0d0 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
2b0e0 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
2b0f0 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
2b100 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
2b110 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
2b120 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2b130 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
2b140 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
2b150 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
2b160 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
2b170 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
2b180 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2b190 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
2b1a0 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
2b1b0 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
2b1c0 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
2b1d0 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
2b1e0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
2b1f0 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
2b200 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
2b210 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
2b220 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2b230 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
2b240 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
2b250 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
2b260 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
2b270 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
2b280 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
2b290 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
2b2a0 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
2b2b0 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
2b2c0 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  fo));.#if SELECT
2b2d0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
2b2e0 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
2b2f0 6e 64 65 6e 74 2b 2b 3b 0a 20 20 53 45 4c 45 43  ndent++;.  SELEC
2b300 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c  TTRACE(1,pParse,
2b310 70 2c 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65  p, ("begin proce
2b320 73 73 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 69  ssing:\n"));.  i
2b330 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
2b340 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b  Trace & 0x100 ){
2b350 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2b360 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2b370 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2b380 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2b390 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2b3a0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2b3b0 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  istFifo );.  ass
2b3c0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2b3d0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2b3e0 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b  est!=SRT_Fifo );
2b3f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f  .  assert( p->pO
2b400 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65  rderBy==0 || pDe
2b410 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44  st->eDest!=SRT_D
2b420 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73  istQueue );.  as
2b430 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
2b440 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
2b450 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20  Dest!=SRT_Queue 
2b460 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62  );.  if( Ignorab
2b470 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29  leOrderby(pDest)
2b480 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70   ){.    assert(p
2b490 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
2b4a0 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74  _Exists || pDest
2b4b0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69  ->eDest==SRT_Uni
2b4c0 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  on || .         
2b4d0 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d    pDest->eDest==
2b4e0 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44  SRT_Except || pD
2b4f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2b500 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20  Discard ||.     
2b510 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
2b520 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c  st==SRT_Queue  |
2b530 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
2b540 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a  SRT_DistFifo ||.
2b550 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
2b560 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
2b570 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d  tQueue || pDest-
2b580 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f  >eDest==SRT_Fifo
2b590 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44  );.    /* If ORD
2b5a0 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64  ER BY makes no d
2b5b0 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65  ifference in the
2b5c0 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69   output then nei
2b5d0 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a  ther does.    **
2b5e0 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20   DISTINCT so it 
2b5f0 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74  can be removed t
2b600 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  oo. */.    sqlit
2b610 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2b620 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
2b630 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  );.    p->pOrder
2b640 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  By = 0;.    p->s
2b650 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
2b660 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
2b670 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
2b680 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
2b690 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c    memset(&sSort,
2b6a0 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74   0, sizeof(sSort
2b6b0 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64  ));.  sSort.pOrd
2b6c0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
2b6d0 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  By;.  pTabList =
2b6e0 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20   p->pSrc;.  if( 
2b6f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2b700 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b710 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
2b720 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61  ect_end;.  }.  a
2b730 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
2b740 21 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d  !=0 );.  isAgg =
2b750 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
2b760 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
2b770 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
2b780 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20  E_ENABLED.  if( 
2b790 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
2b7a0 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20  ce & 0x100 ){.  
2b7b0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
2b7c0 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 20 28 22  100,pParse,p, ("
2b7d0 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c  after name resol
2b7e0 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20  ution:\n"));.   
2b7f0 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
2b800 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
2b810 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2b820 2a 20 54 72 79 20 74 6f 20 66 6c 61 74 74 65 6e  * Try to flatten
2b830 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 74   subqueries in t
2b840 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75  he FROM clause u
2b850 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  p into the main 
2b860 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21  query.  */.#if !
2b870 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2b880 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
2b890 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2b8a0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
2b8b0 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
2b8c0 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
2b8d0 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2b8e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2b8f0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
2b900 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
2b910 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
2b920 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
2b930 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53  ;.    int isAggS
2b940 75 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ub;.    Table *p
2b950 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
2b960 62 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  b;.    if( pSub=
2b970 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
2b980 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73      /* Catch mis
2b990 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63  match in the dec
2b9a0 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  lared columns of
2b9b0 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
2b9c0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
2b9d0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
2b9e0 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48  SELECT on the RH
2b9f0 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61  S */.    if( pTa
2ba00 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70  b->nCol!=pSub->p
2ba10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
2ba20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ba30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
2ba40 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
2ba50 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20  ns for '%s' but 
2ba60 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20  got %d",.       
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2ba80 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d  Tab->nCol, pTab-
2ba90 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45  >zName, pSub->pE
2baa0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
2bab0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
2bac0 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
2bad0 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75 62  isAggSub = (pSub
2bae0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2baf0 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
2bb00 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75     if( flattenSu
2bb10 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70  bquery(pParse, p
2bb20 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67  , i, isAgg, isAg
2bb30 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f  gSub) ){.      /
2bb40 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
2bb50 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
2bb60 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
2bb70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
2bb80 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20  AggSub ){.      
2bb90 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20    isAgg = 1;.   
2bba0 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
2bbb0 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
2bbc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bbd0 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  i = -1;.    }.  
2bbe0 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
2bbf0 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62  pSrc;.    if( db
2bc00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2bc10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
2bc20 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72  ;.    if( !Ignor
2bc30 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
2bc40 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72  t) ){.      sSor
2bc50 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t.pOrderBy = p->
2bc60 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
2bc70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2bc80 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74   Get a pointer t
2bc90 68 65 20 56 44 42 45 20 75 6e 64 65 72 20 63 6f  he VDBE under co
2bca0 6e 73 74 72 75 63 74 69 6f 6e 2c 20 61 6c 6c 6f  nstruction, allo
2bcb0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 56 44 42  cating a new VDB
2bcc0 45 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 64 6f  E if one.  ** do
2bcd0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
2bce0 78 69 73 74 20 2a 2f 0a 20 20 76 20 3d 20 73 71  xist */.  v = sq
2bcf0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
2bd00 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
2bd10 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2bd20 6e 64 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  nd;..#ifndef SQL
2bd30 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
2bd40 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61  D_SELECT.  /* Ha
2bd50 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ndle compound SE
2bd60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
2bd70 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72 61  using the separa
2bd80 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29  te multiSelect()
2bd90 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e  .  ** procedure.
2bda0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
2bdb0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63 20  Prior ){.    rc 
2bdc0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50  = multiSelect(pP
2bdd0 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
2bde0 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49  .    explainSetI
2bdf0 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69  nteger(pParse->i
2be00 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f  SelectId, iResto
2be10 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 23 69 66  reSelectId);.#if
2be20 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2be30 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54  BLED.    SELECTT
2be40 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
2be50 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73  ("end compound-s
2be60 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
2be70 5c 6e 22 29 29 3b 0a 20 20 20 20 70 50 61 72 73  \n"));.    pPars
2be80 65 2d 3e 6e 53 65 6c 65 63 74 49 6e 64 65 6e 74  e->nSelectIndent
2be90 2d 2d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  --;.#endif.    r
2bea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
2beb0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
2bec0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
2bed0 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
2bee0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
2bef0 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
2bf00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
2bf10 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
2bf20 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2bf30 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b  VIEW).  for(i=0;
2bf40 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2bf50 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2bf60 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2bf70 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
2bf80 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
2bf90 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
2bfa0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
2bfb0 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
2bfc0 74 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  t;.    if( pSub=
2bfd0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
2bfe0 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73      /* Sometimes
2bff0 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
2c000 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65  subquery will be
2c010 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20   generated more 
2c020 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65  than.    ** once
2c030 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  , if the subquer
2c040 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  y is part of the
2c050 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
2c060 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20   a LEFT JOIN,.  
2c070 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65    ** for example
2c080 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
2c090 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61   do not regenera
2c0a0 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d  te the code to m
2c0b0 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61  anifest.    ** a
2c0c0 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d   view or the co-
2c0d0 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65  routine to imple
2c0e0 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68  ment a view.  Th
2c0f0 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
2c100 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69  .    ** is suffi
2c110 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68  cient, though th
2c120 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
2c130 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65  manifest the vie
2c140 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20  w does need.    
2c150 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ** to be invoked
2c160 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
2c170 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
2c180 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69  llSub ){.      i
2c190 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61  f( pItem->fg.via
2c1a0 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a  Coroutine==0 ){.
2c1b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2c1c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2c1d0 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65  Gosub, pItem->re
2c1e0 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  gReturn, pItem->
2c1f0 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
2c200 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
2c210 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
2c220 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
2c230 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
2c240 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
2c250 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
2c260 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
2c270 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74  referred to by t
2c280 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
2c290 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
2c2a0 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
2c2b0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
2c2c0 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
2c2d0 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
2c2e0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
2c2f0 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
2c300 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
2c310 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
2c320 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
2c330 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
2c340 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
2c350 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
2c360 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
2c370 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
2c380 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
2c390 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
2c3a0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
2c3b0 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  p);..    /* Make
2c3c0 20 63 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74   copies of const
2c3d0 61 6e 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ant WHERE-clause
2c3e0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75   terms in the ou
2c3f0 74 65 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20  ter query down. 
2c400 20 20 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65     ** inside the
2c410 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 69 73   subquery.  This
2c420 20 63 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75   can help the su
2c430 62 71 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f  bquery to run mo
2c440 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a  re efficiently..
2c450 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
2c460 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
2c470 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 3d 3d  pe & JT_OUTER)==
2c480 30 0a 20 20 20 20 20 26 26 20 70 75 73 68 44 6f  0.     && pushDo
2c490 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
2c4a0 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57  rse, pSub, p->pW
2c4b0 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
2c4c0 72 73 6f 72 29 0a 20 20 20 20 29 7b 0a 23 69 66  rsor).    ){.#if
2c4d0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2c4e0 42 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73  BLED.      if( s
2c4f0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2c500 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
2c510 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
2c520 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x100,pParse,p,
2c530 28 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c  ("After WHERE-cl
2c540 61 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c  ause push-down:\
2c550 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n"));.        sq
2c560 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
2c570 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
2c580 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2c590 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72   }..    /* Gener
2c5a0 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  ate code to impl
2c5b0 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65  ement the subque
2c5c0 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ry.    **.    **
2c5d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
2c5e0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
2c5f0 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20  a co-routine if 
2c600 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
2c610 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 20 20 20   true:.    **   
2c620 28 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (1)  The subquer
2c630 79 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  y is guaranteed 
2c640 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72 20  to be the outer 
2c650 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69 74  loop (so that it
2c660 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 64  .    **        d
2c670 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
2c680 62 65 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65  be computed more
2c690 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20   than once).    
2c6a0 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20 41 4c  **   (2)  The AL
2c6b0 4c 20 6b 65 79 77 6f 72 64 20 61 66 74 65 72 20  L keyword after 
2c6c0 53 45 4c 45 43 54 20 69 73 20 6f 6d 69 74 74 65  SELECT is omitte
2c6d0 64 2e 20 20 28 41 70 70 6c 69 63 61 74 69 6f 6e  d.  (Application
2c6e0 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20  s are.    **    
2c6f0 20 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20 73      allowed to s
2c700 61 79 20 22 53 45 4c 45 43 54 20 41 4c 4c 22 20  ay "SELECT ALL" 
2c710 69 6e 73 74 65 61 64 20 6f 66 20 6a 75 73 74 20  instead of just 
2c720 22 53 45 4c 45 43 54 22 20 74 6f 20 64 69 73 61  "SELECT" to disa
2c730 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ble.    **      
2c740 20 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 2d    the use of co-
2c750 72 6f 75 74 69 6e 65 73 2e 29 0a 20 20 20 20 2a  routines.).    *
2c760 2a 20 20 20 28 33 29 20 20 43 6f 2d 72 6f 75 74  *   (3)  Co-rout
2c770 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ines are not dis
2c780 61 62 6c 65 64 20 75 73 69 6e 67 20 73 71 6c 69  abled using sqli
2c790 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2c7a0 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ().    **       
2c7b0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
2c7c0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
2c7d0 4f 4e 53 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ONS..    **.    
2c7e0 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68 65  ** TODO: Are the
2c7f0 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 73  re other reasons
2c800 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20 75   beside (1) to u
2c810 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a  se a co-routine.
2c820 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
2c830 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20  ation?.    */.  
2c840 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20 20    if( i==0.     
2c850 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
2c860 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20  rc==1.          
2c870 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e    || (pTabList->
2c880 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[1].fg.jointype
2c890 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f  &(JT_LEFT|JT_CRO
2c8a0 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31 29  SS))!=0)  /* (1)
2c8b0 20 2a 2f 0a 20 20 20 20 20 26 26 20 28 70 2d 3e   */.     && (p->
2c8c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 6c  selFlags & SF_Al
2c8d0 6c 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  l)==0           
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8f0 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
2c900 2f 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  /.     && Optimi
2c910 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2c920 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72  , SQLITE_SubqCor
2c930 6f 75 74 69 6e 65 29 20 20 20 20 20 20 20 20 20  outine)         
2c940 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a        /* (3) */.
2c950 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2c960 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72  Implement a co-r
2c970 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
2c980 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c 65   return a single
2c990 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
2c9a0 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  lt.      ** set 
2c9b0 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74 69  on each invocati
2c9c0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
2c9d0 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20 3d     int addrTop =
2c9e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2c9f0 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20 20  entAddr(v)+1;.  
2ca00 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
2ca10 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
2ca20 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
2ca30 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2ca40 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
2ca50 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
2ca60 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70  turn, 0, addrTop
2ca70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2ca80 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
2ca90 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2caa0 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  e));.      pItem
2cab0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
2cac0 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73  addrTop;.      s
2cad0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
2cae0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
2caf0 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
2cb00 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
2cb10 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
2cb20 74 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65  teger(pItem->iSe
2cb30 6c 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72  lectId, (u8)pPar
2cb40 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
2cb50 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2cb60 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
2cb70 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20  pSub, &dest);.  
2cb80 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d      pItem->pTab-
2cb90 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53  >nRowLogEst = pS
2cba0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  ub->nSelectRow;.
2cbb0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
2cbc0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
2cbd0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
2cbe0 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
2cbf0 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
2cc00 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
2cc10 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72  tine(v, pItem->r
2cc20 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
2cc30 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2cc40 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d  Here(v, addrTop-
2cc50 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
2cc60 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
2cc70 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
2cc80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2cc90 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
2cca0 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
2ccb0 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61  fill an ephemera
2ccc0 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20  l table with.   
2ccd0 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e     ** the conten
2cce0 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65  t of this subque
2ccf0 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72  ry.  pItem->addr
2cd00 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69  FillSub will poi
2cd10 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  nt.      ** to t
2cd20 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2cd30 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72  e generated subr
2cd40 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e  outine.  pItem->
2cd50 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20  regReturn.      
2cd60 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72  ** is a register
2cd70 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f   allocated to ho
2cd80 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ld the subroutin
2cd90 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
2cda0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2cdb0 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20  int topAddr;.   
2cdc0 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20     int onceAddr 
2cdd0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  = 0;.      int r
2cde0 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73  etAddr;.      as
2cdf0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64  sert( pItem->add
2ce00 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20  rFillSub==0 );. 
2ce10 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52       pItem->regR
2ce20 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
2ce30 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f  ->nMem;.      to
2ce40 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  pAddr = sqlite3V
2ce50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ce60 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65  Integer, 0, pIte
2ce70 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  m->regReturn);. 
2ce80 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
2ce90 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64  FillSub = topAdd
2cea0 72 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  r+1;.      if( p
2ceb0 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65  Item->fg.isCorre
2cec0 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lated==0 ){.    
2ced0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
2cee0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f  bquery is not co
2cef0 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20  rrelated and if 
2cf00 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64  we are not insid
2cf10 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
2cf20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20  a trigger, then 
2cf30 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
2cf40 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75  compute the valu
2cf50 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
2cf60 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63  y.        ** onc
2cf70 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e  e. */.        on
2cf80 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  ceAddr = sqlite3
2cf90 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
2cfa0 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65  _Once); VdbeCove
2cfb0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
2cfc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2cfd0 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22   "materialize \"
2cfe0 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54  %s\"", pItem->pT
2cff0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
2d000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d010 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
2d020 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
2d030 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
2d040 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
2d050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d060 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
2d070 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
2d080 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d  _EphemTab, pItem
2d090 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2d0a0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
2d0b0 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
2d0c0 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
2d0d0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
2d0e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
2d0f0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
2d100 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
2d110 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
2d120 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62  RowLogEst = pSub
2d130 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
2d140 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72      if( onceAddr
2d150 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
2d160 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64  mpHere(v, onceAd
2d170 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64  dr);.      retAd
2d180 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2d190 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2d1a0 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  urn, pItem->regR
2d1b0 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64  eturn);.      Vd
2d1c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  beComment((v, "e
2d1d0 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  nd %s", pItem->p
2d1e0 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
2d1f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2d200 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64  hangeP1(v, topAd
2d210 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20  dr, retAddr);.  
2d220 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
2d230 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
2d240 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rse);.    }.    
2d250 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2d260 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
2d270 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72  ct_end;.    pPar
2d280 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73  se->nHeight -= s
2d290 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
2d2a0 48 65 69 67 68 74 28 70 29 3b 0a 20 20 7d 0a 23  Height(p);.  }.#
2d2b0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 56 61 72 69  endif..  /* Vari
2d2c0 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ous elements of 
2d2d0 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70 69 65  the SELECT copie
2d2e0 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72  d into local var
2d2f0 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20  iables for.  ** 
2d300 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20  convenience */. 
2d310 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
2d320 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20 3d 20  ist;.  pWhere = 
2d330 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
2d340 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
2d350 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
2d360 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
2d370 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
2d380 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
2d390 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
2d3a0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
2d3b0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28  CE_ENABLED.  if(
2d3c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2d3d0 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
2d3e0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
2d3f0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
2d400 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  After all FROM-c
2d410 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c  lause analysis:\
2d420 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2d430 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2d440 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2d450 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
2d460 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  e query is DISTI
2d470 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  NCT with an ORDE
2d480 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20  R BY but is not 
2d490 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e  an aggregate, an
2d4a0 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73  d .  ** if the s
2d4b0 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68  elect-list is th
2d4c0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52  e same as the OR
2d4d0 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65  DER BY list, the
2d4e0 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  n this query.  *
2d4f0 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
2d500 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59  en as a GROUP BY
2d510 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
2d520 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  , this:.  **.  *
2d530 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
2d540 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  TINCT xyz FROM .
2d550 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  .. ORDER BY xyz.
2d560 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61    **.  ** is tra
2d570 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a  nsformed to:.  *
2d580 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
2d590 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47  T xyz FROM ... G
2d5a0 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45  ROUP BY xyz ORDE
2d5b0 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
2d5c0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
2d5d0 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
2d5e0 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
2d5f0 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
2d600 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
2d610 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
2d620 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
2d630 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
2d640 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
2d650 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
2d660 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
2d670 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
2d680 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
2d690 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
2d6a0 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
2d6b0 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
2d6c0 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
2d6d0 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
2d6e0 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
2d6f0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
2d700 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
2d710 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
2d720 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
2d730 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2d740 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f  Compare(sSort.pO
2d750 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20  rderBy, pEList, 
2d760 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  -1)==0.  ){.    
2d770 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
2d780 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
2d790 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
2d7a0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
2d7b0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
2d7c0 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20   pEList, 0);.   
2d7d0 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20   /* Notice that 
2d7e0 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f  even thought SF_
2d7f0 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65 65  Distinct has bee
2d800 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70  n cleared from p
2d810 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20  ->selFlags,.    
2d820 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63 74  ** the sDistinct
2d830 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c  .isTnct is still
2d840 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73   set.  Hence, is
2d850 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73 20  Tnct represents 
2d860 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69  the.    ** origi
2d870 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74  nal setting of t
2d880 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66  he SF_Distinct f
2d890 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72  lag, not the cur
2d8a0 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a  rent setting */.
2d8b0 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69 73      assert( sDis
2d8c0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a  tinct.isTnct );.
2d8d0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2d8e0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
2d8f0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
2d900 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
2d910 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
2d920 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
2d930 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54  ("Transform DIST
2d940 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20  INCT into GROUP 
2d950 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  BY:\n"));.      
2d960 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2d970 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2d980 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2d990 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
2d9a0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
2d9b0 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61  lause, then crea
2d9c0 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  te an ephemeral 
2d9d0 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f  index to.  ** do
2d9e0 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42   the sorting.  B
2d9f0 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20  ut this sorting 
2da00 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
2da10 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a  might end up.  *
2da20 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  * being unused i
2da30 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
2da40 65 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70  e extracted in p
2da50 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  re-sorted order.
2da60 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73  .  ** If that is
2da70 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
2da80 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
2da90 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
2daa0 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68   will be.  ** ch
2dab0 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e  anged to an OP_N
2dac0 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75  oop once we figu
2dad0 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
2dae0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
2daf0 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64  .  ** not needed
2db00 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64  .  The sSort.add
2db10 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61  rSortIndex varia
2db20 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 66  ble is used to f
2db30 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74  acilitate.  ** t
2db40 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f  hat change..  */
2db50 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72  .  if( sSort.pOr
2db60 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79  derBy ){.    Key
2db70 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
2db80 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
2db90 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
2dba0 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74  st(pParse, sSort
2dbb0 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45  .pOrderBy, 0, pE
2dbc0 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
2dbd0 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
2dbe0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
2dbf0 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64  +;.    sSort.add
2dc00 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20  rSortIndex =.   
2dc10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2dc20 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
2dc30 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
2dc40 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
2dc50 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  or, sSort.pOrder
2dc60 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69  By->nExpr+1+pELi
2dc70 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20  st->nExpr, 0,.  
2dc80 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
2dc90 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2dca0 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d  NFO.      );.  }
2dcb0 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e  else{.    sSort.
2dcc0 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20  addrSortIndex = 
2dcd0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  -1;.  }..  /* If
2dce0 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64   the output is d
2dcf0 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65  estined for a te
2dd00 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f  mporary table, o
2dd10 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a  pen that table..
2dd20 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
2dd30 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ->eDest==SRT_Eph
2dd40 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  emTab ){.    sql
2dd50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2dd60 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
2dd70 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  al, pDest->iSDPa
2dd80 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  rm, pEList->nExp
2dd90 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  r);.  }..  /* Se
2dda0 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20  t the limiter.. 
2ddb0 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c   */.  iEnd = sql
2ddc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2ddd0 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  l(v);.  if( (p->
2dde0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69  selFlags & SF_Fi
2ddf0 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a  xedLimit)==0 ){.
2de00 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
2de10 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62  w = 320;  /* 4 b
2de20 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20  illion rows */. 
2de30 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69   }.  computeLimi
2de40 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
2de50 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
2de60 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
2de70 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  && sSort.addrSor
2de80 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20  tIndex>=0 ){.   
2de90 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2dea0 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72  geOpcode(v, sSor
2deb0 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c  t.addrSortIndex,
2dec0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b   OP_SorterOpen);
2ded0 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46  .    sSort.sortF
2dee0 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47  lags |= SORTFLAG
2def0 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a  _UseSorter;.  }.
2df00 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70  .  /* Open an ep
2df10 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f  hemeral index to
2df20 20 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73   use for the dis
2df30 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a  tinct set..  */.
2df40 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2df50 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
2df60 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  ){.    sDistinct
2df70 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73  .tabTnct = pPars
2df80 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
2df90 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63  Distinct.addrTnc
2dfa0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
2dfb0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
2dfc0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
2dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfe0 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e 63          sDistinc
2dff0 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c  t.tabTnct, 0, 0,
2e000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2e020 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d  har*)keyInfoFrom
2e030 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
2e040 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c   p->pEList,0,0),
2e050 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
2e070 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73  _KEYINFO);.    s
2e080 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2e090 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52  P5(v, BTREE_UNOR
2e0a0 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73  DERED);.    sDis
2e0b0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
2e0c0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
2e0d0 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65  _UNORDERED;.  }e
2e0e0 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  lse{.    sDistin
2e0f0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
2e100 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
2e110 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OP;.  }..  if( !
2e120 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70 42  isAgg && pGroupB
2e130 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  y==0 ){.    /* N
2e140 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  o aggregate func
2e150 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f  tions and no GRO
2e160 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
2e170 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61      u16 wctrlFla
2e180 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e  gs = (sDistinct.
2e190 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57  isTnct ? WHERE_W
2e1a0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30  ANT_DISTINCT : 0
2e1b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
2e1c0 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d  HERE_USE_LIMIT==
2e1d0 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b  SF_FixedLimit );
2e1e0 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20  .    wctrlFlags 
2e1f0 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  |= p->selFlags &
2e200 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a   SF_FixedLimit;.
2e210 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
2e220 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
2e230 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
2e240 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2e250 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2e260 69 73 74 2c 20 70 57 68 65 72 65 2c 20 73 53 6f  ist, pWhere, sSo
2e270 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a 20 20 20  rt.pOrderBy,.   
2e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e290 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
2e2a0 45 4c 69 73 74 2c 20 77 63 74 72 6c 46 6c 61 67  EList, wctrlFlag
2e2b0 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  s, p->nSelectRow
2e2c0 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
2e2d0 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65  o==0 ) goto sele
2e2e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
2e2f0 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
2e300 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
2e310 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52  o) < p->nSelectR
2e320 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ow ){.      p->n
2e330 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69  SelectRow = sqli
2e340 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
2e350 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a  wCount(pWInfo);.
2e360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44      }.    if( sD
2e370 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
2e380 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
2e390 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
2e3a0 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69   ){.      sDisti
2e3b0 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
2e3c0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
2e3d0 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a  stinct(pWInfo);.
2e3e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 53      }.    if( sS
2e3f0 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
2e400 20 20 20 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53        sSort.nOBS
2e410 61 74 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  at = sqlite3Wher
2e420 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2e430 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e  o);.      sSort.
2e440 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
2e450 70 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  p = sqlite3Where
2e460 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
2e470 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2e480 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74  if( sSort.nOBSat
2e490 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ==sSort.pOrderBy
2e4a0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
2e4b0 20 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42     sSort.pOrderB
2e4c0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 0;.      }. 
2e4d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2e4e0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
2e4f0 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62  at was created b
2e500 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65  y a prior OP_Ope
2e510 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20  nEphemeral .    
2e520 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65  ** instruction e
2e530 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e  nded up not bein
2e540 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63  g needed, then c
2e550 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
2e560 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a  nEphemeral.    *
2e570 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  * into an OP_Noo
2e580 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
2e590 28 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  ( sSort.addrSort
2e5a0 49 6e 64 65 78 3e 3d 30 20 26 26 20 73 53 6f 72  Index>=0 && sSor
2e5b0 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  t.pOrderBy==0 ){
2e5c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2e5d0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
2e5e0 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
2e5f0 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 0a 20  Index);.    }.. 
2e600 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74     /* Use the st
2e610 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f  andard inner loo
2e620 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74  p. */.    select
2e630 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
2e640 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d 31 2c  , p, pEList, -1,
2e650 20 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69   &sSort, &sDisti
2e660 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20  nct, pDest,.    
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e680 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74  sqlite3WhereCont
2e690 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f  inueLabel(pWInfo
2e6a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2e6b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
2e6c0 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
2e6d0 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Info));..    /* 
2e6e0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
2e6f0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
2e700 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68  */.    sqlite3Wh
2e710 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
2e720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2e730 54 68 69 73 20 63 61 73 65 20 77 68 65 6e 20 74  This case when t
2e740 68 65 72 65 20 65 78 69 73 74 20 61 67 67 72 65  here exist aggre
2e750 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f  gate functions o
2e760 72 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  r a GROUP BY cla
2e770 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  use.    ** or bo
2e780 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f  th */.    NameCo
2e790 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a  ntext sNC;    /*
2e7a0 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
2e7b0 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67  r processing agg
2e7c0 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69  regate informati
2e7d0 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41  on */.    int iA
2e7e0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
2e7f0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
2e800 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63  ss for storing c
2e810 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2e820 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d  */.    int iBMem
2e830 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2e840 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20  rst Mem address 
2e850 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f  for previous GRO
2e860 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
2e870 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20   iUseFlag;      
2e880 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
2e890 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64  holding flag ind
2e8a0 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20  icating that at 
2e8b0 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20  least.          
2e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2e8d0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
2e8e0 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67  input to the agg
2e8f0 72 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e  regator has been
2e900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e910 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
2e920 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74  essed */.    int
2e930 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20   iAbortFlag;    
2e940 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20   /* Mem address 
2e950 77 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65  which causes que
2e960 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69  ry abort if posi
2e970 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tive */.    int 
2e980 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20  groupBySort;    
2e990 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f  /* Rows come fro
2e9a0 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55  m source in GROU
2e9b0 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20  P BY order */.  
2e9c0 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20    int addrEnd;  
2e9d0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2e9e0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74  processing for t
2e9f0 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
2ea00 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d    int sortPTab =
2ea10 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74   0;   /* Pseudot
2ea20 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63  able used to dec
2ea30 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75  ode sorting resu
2ea40 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lts */.    int s
2ea50 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f  ortOut = 0;    /
2ea60 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73 74 65  * Output registe
2ea70 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  r from the sorte
2ea80 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 72 64  r */.    int ord
2ea90 65 72 42 79 47 72 70 20 3d 20 30 3b 20 2f 2a 20  erByGrp = 0; /* 
2eaa0 54 72 75 65 20 69 66 20 74 68 65 20 47 52 4f 55  True if the GROU
2eab0 50 20 42 59 20 61 6e 64 20 4f 52 44 45 52 20 42  P BY and ORDER B
2eac0 59 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 2a  Y are the same *
2ead0 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  /..    /* Remove
2eae0 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69   any and all ali
2eaf0 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  ases between the
2eb00 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
2eb10 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50  the.    ** GROUP
2eb20 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
2eb30 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
2eb40 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  pBy ){.      int
2eb50 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
2eb60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2eb70 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2eb80 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2eb90 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2eba0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
2ebb0 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e   over expression
2ebc0 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20   in a list */.. 
2ebd0 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45       for(k=p->pE
2ebe0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74  List->nExpr, pIt
2ebf0 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  em=p->pEList->a;
2ec00 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
2ec10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
2ec20 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
2ec30 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2ec40 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79    for(k=pGroupBy
2ec50 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
2ec60 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b  GroupBy->a; k>0;
2ec70 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   k--, pItem++){.
2ec80 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75          pItem->u
2ec90 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  .x.iAlias = 0;. 
2eca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2ecb0 65 72 74 28 20 36 36 3d 3d 73 71 6c 69 74 65 33  ert( 66==sqlite3
2ecc0 4c 6f 67 45 73 74 28 31 30 30 29 20 29 3b 0a 20  LogEst(100) );. 
2ecd0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c       if( p->nSel
2ece0 65 63 74 52 6f 77 3e 36 36 20 29 20 70 2d 3e 6e  ectRow>66 ) p->n
2ecf0 53 65 6c 65 63 74 52 6f 77 20 3d 20 36 36 3b 0a  SelectRow = 66;.
2ed00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ed10 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
2ed20 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a  te3LogEst(1) );.
2ed30 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
2ed40 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Row = 0;.    }..
2ed50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2ed60 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
2ed70 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
2ed80 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
2ed90 65 79 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 64  ey are.    ** id
2eda0 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 69 74  entical, then it
2edb0 20 6d 61 79 20 62 65 20 70 6f 73 73 69 62 6c 65   may be possible
2edc0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
2edd0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2ede0 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 67  .    ** on the g
2edf0 72 6f 75 6e 64 73 20 74 68 61 74 20 74 68 65 20  rounds that the 
2ee00 47 52 4f 55 50 20 42 59 20 77 69 6c 6c 20 63 61  GROUP BY will ca
2ee10 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  use elements to 
2ee20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20 20 2a 2a  come out .    **
2ee30 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
2ee40 6f 72 64 65 72 2e 20 49 74 20 61 6c 73 6f 20 6d  order. It also m
2ee50 61 79 20 6e 6f 74 20 2d 20 74 68 65 20 47 52 4f  ay not - the GRO
2ee60 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20  UP BY might use 
2ee70 61 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  a.    ** databas
2ee80 65 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 75  e index that cau
2ee90 73 65 73 20 72 6f 77 73 20 74 6f 20 62 65 20 67  ses rows to be g
2eea0 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65 72 20  rouped together 
2eeb0 61 73 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  as required.    
2eec0 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ** but not actua
2eed0 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45 69 74 68  lly sorted. Eith
2eee0 65 72 20 77 61 79 2c 20 72 65 63 6f 72 64 20 74  er way, record t
2eef0 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
2ef00 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59  .    ** ORDER BY
2ef10 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c   and GROUP BY cl
2ef20 61 75 73 65 73 20 61 72 65 20 74 68 65 20 73 61  auses are the sa
2ef30 6d 65 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  me by setting th
2ef40 65 20 6f 72 64 65 72 42 79 47 72 70 0a 20 20 20  e orderByGrp.   
2ef50 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e 20 20 2a   ** variable.  *
2ef60 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
2ef70 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
2ef80 28 70 47 72 6f 75 70 42 79 2c 20 73 53 6f 72 74  (pGroupBy, sSort
2ef90 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d  .pOrderBy, -1)==
2efa0 30 20 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72  0 ){.      order
2efb0 42 79 47 72 70 20 3d 20 31 3b 0a 20 20 20 20 7d  ByGrp = 1;.    }
2efc0 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
2efd0 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
2efe0 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
2eff0 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
2f000 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
2f010 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
2f020 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
2f030 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
2f040 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
2f050 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
2f060 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
2f070 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
2f080 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
2f090 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
2f0a0 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
2f0b0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
2f0c0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2f0d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
2f0e0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
2f0f0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
2f100 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
2f110 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
2f120 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
2f130 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
2f140 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
2f150 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65     sAggInfo.mnRe
2f160 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
2f170 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  +1;.    sAggInfo
2f180 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
2f190 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
2f1a0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a 20 30  oupBy->nExpr : 0
2f1b0 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70  ;.    sAggInfo.p
2f1c0 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
2f1d0 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  By;.    sqlite3E
2f1e0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2f1f0 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b  t(&sNC, pEList);
2f200 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
2f210 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
2f220 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65  sNC, sSort.pOrde
2f230 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48  rBy);.    if( pH
2f240 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73  aving ){.      s
2f250 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2f260 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e 43  eAggregates(&sNC
2f270 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  , pHaving);.    
2f280 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e  }.    sAggInfo.n
2f290 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41  Accumulator = sA
2f2a0 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a  ggInfo.nColumn;.
2f2b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2f2c0 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
2f2d0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2f2e0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2f2f0 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75  rty(sAggInfo.aFu
2f300 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f  nc[i].pExpr, EP_
2f310 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2f320 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
2f330 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  |= NC_InAggFunc;
2f340 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2f350 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2f360 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e  (&sNC, sAggInfo.
2f370 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e  aFunc[i].pExpr->
2f380 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  x.pList);.      
2f390 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
2f3a0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
2f3b0 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f    }.    sAggInfo
2f3c0 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mxReg = pParse-
2f3d0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64  >nMem;.    if( d
2f3e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2f3f0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2f400 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
2f410 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
2f420 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
2f430 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
2f440 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
2f450 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
2f460 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
2f470 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
2f480 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
2f490 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
2f4a0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
2f4b0 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
2f4c0 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
2f4d0 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
2f4e0 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
2f4f0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
2f500 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
2f510 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
2f520 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2f530 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
2f540 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
2f550 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
2f560 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
2f570 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
2f580 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
2f590 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
2f5a0 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
2f5b0 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
2f5c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
2f5d0 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
2f5e0 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
2f5f0 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2f600 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
2f610 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
2f620 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
2f630 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
2f640 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
2f650 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
2f660 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
2f670 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
2f680 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
2f690 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
2f6a0 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
2f6b0 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
2f6c0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
2f6d0 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
2f6e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
2f6f0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
2f700 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
2f710 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
2f720 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
2f730 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
2f740 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
2f750 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
2f760 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
2f770 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
2f780 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
2f790 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
2f7a0 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
2f7b0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
2f7c0 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
2f7d0 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  l, the OP_Sorter
2f7e0 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  Open instruction
2f7f0 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
2f800 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
2f810 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
2f820 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
2f830 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
2f840 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2f850 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
2f860 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
2f870 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
2f880 6f 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e  oupBy, 0, sAggIn
2f890 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  fo.nColumn);.   
2f8a0 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
2f8b0 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
2f8c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
2f8d0 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20  erOpen, .       
2f8e0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2f8f0 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f  ingIdx, sAggInfo
2f900 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
2f910 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28   .          0, (
2f920 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
2f930 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
2f940 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
2f950 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
2f960 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
2f970 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
2f980 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
2f990 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
2f9a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
2f9b0 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
2f9c0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
2f9d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
2f9e0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
2f9f0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2fa00 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
2fa10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2fa20 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
2fa30 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
2fa40 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2fa50 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
2fa60 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
2fa70 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
2fa80 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
2fa90 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
2faa0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
2fab0 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2fac0 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
2fad0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
2fae0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2faf0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
2fb00 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
2fb10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2fb20 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
2fb30 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
2fb40 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2fb50 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
2fb60 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
2fb70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2fb80 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
2fb90 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
2fba0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2fbb0 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
2fbc0 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
2fbd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2fbe0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2fbf0 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
2fc00 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
2fc10 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
2fc20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
2fc30 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
2fc40 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
2fc50 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
2fc60 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
2fc70 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
2fc80 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
2fc90 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
2fca0 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
2fcb0 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
2fcc0 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
2fcd0 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
2fce0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
2fcf0 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
2fd00 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
2fd10 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
2fd20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
2fd30 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2fd40 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2fd50 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
2fd60 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
2fd70 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
2fd80 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2fd90 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2fda0 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
2fdb0 70 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  pBy, 0,.        
2fdc0 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20    WHERE_GROUPBY 
2fdd0 7c 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20  | (orderByGrp ? 
2fde0 57 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55  WHERE_SORTBYGROU
2fdf0 50 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20  P : 0), 0.      
2fe00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
2fe10 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
2fe20 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
2fe30 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2fe40 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f  IsOrdered(pWInfo
2fe50 29 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  )==pGroupBy->nEx
2fe60 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pr ){.        /*
2fe70 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
2fe80 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
2fe90 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
2fea0 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
2feb0 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
2fec0 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
2fed0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
2fee0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
2fef0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
2ff00 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
2ff10 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
2ff20 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
2ff30 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
2ff40 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
2ff50 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
2ff60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ff70 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
2ff80 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
2ff90 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
2ffa0 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
2ffb0 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
2ffc0 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
2ffd0 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
2ffe0 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
2fff0 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
30000 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
30010 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
30020 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
30030 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
30040 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
30050 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
30060 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
30070 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
30080 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
30090 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
300a0 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
300b0 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
300c0 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
300d0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
300e0 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
300f0 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
30100 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
30110 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
30120 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
30130 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
30140 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
30150 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
30160 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
30170 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
30180 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
30190 6c 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  l = nGroupBy;.  
301a0 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
301b0 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  By;.        for(
301c0 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e  i=0; i<sAggInfo.
301d0 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
301e0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67           if( sAg
301f0 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53  gInfo.aCol[i].iS
30200 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
30210 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  {.            nC
30220 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ol++;.          
30230 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    j++;.         
30240 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
30250 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73       regBase = s
30260 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
30270 67 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29  ge(pParse, nCol)
30280 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30290 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
302a0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
302b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
302c0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
302d0 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61   pGroupBy, regBa
302e0 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  se, 0, 0);.     
302f0 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b     j = nGroupBy;
30300 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
30310 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  ; i<sAggInfo.nCo
30320 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
30330 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67        struct Agg
30340 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d  Info_col *pCol =
30350 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b   &sAggInfo.aCol[
30360 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
30370 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
30380 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
30390 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
303a0 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20   j + regBase;.  
303b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
303c0 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
303d0 6d 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20  mnToReg(pParse, 
303e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
303f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30400 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c  pCol->pTab, pCol
30410 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d  ->iColumn, pCol-
30420 3e 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20  >iTable, r1);.  
30430 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
30440 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
30460 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
30470 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
30480 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
30490 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
304a0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
304b0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
304c0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
304d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
304e0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
304f0 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  rInsert, sAggInf
30500 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
30510 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
30520 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
30530 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
30540 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
30550 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
30560 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
30570 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
30580 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
30590 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
305a0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  fo);.        sAg
305b0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
305c0 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20  PTab = sortPTab 
305d0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
305e0 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75  ;.        sortOu
305f0 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
30600 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
30610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
30620 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
30630 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50  penPseudo, sortP
30640 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43  Tab, sortOut, nC
30650 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
30660 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
30670 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
30680 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
30690 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
306a0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
306b0 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42  ent((v, "GROUP B
306c0 59 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43  Y sort")); VdbeC
306d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
306e0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65      sAggInfo.use
306f0 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a  SortingIdx = 1;.
30700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
30710 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
30720 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a  arse);..      }.
30730 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
30740 20 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72   index or tempor
30750 61 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62  ary table used b
30760 79 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73  y the GROUP BY s
30770 6f 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  ort.      ** wil
30780 6c 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69  l naturally deli
30790 76 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20  ver rows in the 
307a0 6f 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62  order required b
307b0 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  y the ORDER BY. 
307c0 20 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20       ** clause, 
307d0 63 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d  cancel the ephem
307e0 65 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20  eral table open 
307f0 63 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20  coded earlier.. 
30800 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
30810 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
30820 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63  mization - the c
30830 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68  orrect answer sh
30840 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61  ould result rega
30850 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a  rdless..      **
30860 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   Use the SQLITE_
30870 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61  GroupByOrder fla
30880 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  g with SQLITE_TE
30890 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52  STCTRL_OPTIMIZER
308a0 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69   to .      ** di
308b0 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
308c0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
308d0 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a  ing purposes.  *
308e0 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65  /.      if( orde
308f0 72 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69  rByGrp && Optimi
30900 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
30910 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  , SQLITE_GroupBy
30920 4f 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26  Order) .       &
30930 26 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c  & (groupBySort |
30940 7c 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  | sqlite3WhereIs
30950 53 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a  Sorted(pWInfo)).
30960 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30970 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
30980 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
30990 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
309a0 4e 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64  Noop(v, sSort.ad
309b0 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
309c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
309d0 45 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72  Evaluate the cur
309e0 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65  rent GROUP BY te
309f0 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  rms and store in
30a00 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20   b0, b1, b2.... 
30a10 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d       ** (b0 is m
30a20 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69  emory location i
30a30 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42  BMem+0, b1 is iB
30a40 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f  Mem+1, and so fo
30a50 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68  rth).      ** Th
30a60 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63  en compare the c
30a70 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
30a80 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68  terms against th
30a90 65 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  e GROUP BY terms
30aa0 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  .      ** from t
30ab0 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
30ac0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
30ad0 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e   in a0, a1, a2..
30ae0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
30af0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d   addrTopOfLoop =
30b00 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
30b10 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
30b20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
30b30 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
30b40 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
30b50 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
30b60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30b70 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
30b80 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Data, sAggInfo.s
30b90 6f 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20  ortingIdx,.     
30ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bb0 20 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f       sortOut, so
30bc0 72 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  rtPTab);.      }
30bd0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
30be0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
30bf0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
30c00 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
30c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
30c20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
30c30 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f  v, OP_Column, so
30c40 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d  rtPTab, j, iBMem
30c50 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  +j);.        }el
30c60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
30c70 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
30c80 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
30c90 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
30ca0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
30cb0 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
30cc0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
30cd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
30ce0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
30cf0 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
30d00 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
30d10 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
30d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30d30 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
30d40 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
30d50 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
30d60 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
30d70 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
30d80 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
30d90 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
30da0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
30db0 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31  OP_Jump, addr1+1
30dc0 2c 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56  , 0, addr1+1); V
30dd0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
30de0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
30df0 74 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e  te code that run
30e00 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47  s whenever the G
30e10 52 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e  ROUP BY changes.
30e20 0a 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65  .      ** Change
30e30 73 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  s in the GROUP B
30e40 59 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62  Y are detected b
30e50 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  y the previous c
30e60 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f  ode.      ** blo
30e70 63 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65  ck.  If there we
30e80 72 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74  re no changes, t
30e90 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69  his block is ski
30ea0 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  pped..      **. 
30eb0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64       ** This cod
30ec0 65 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74  e copies current
30ed0 20 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20   group by terms 
30ee0 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a  in b0,b1,b2,....
30ef0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f        ** over to
30f00 20 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74   a0,a1,a2.  It t
30f10 68 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75  hen calls the ou
30f20 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a  tput subroutine.
30f30 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
30f40 65 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74  ets the aggregat
30f50 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65  e accumulator re
30f60 67 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61  gisters in prepa
30f70 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ration.      ** 
30f80 66 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f  for the next GRO
30f90 55 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20  UP BY batch..   
30fa0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
30fb0 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
30fc0 70 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69  pParse, iBMem, i
30fd0 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e  AMem, pGroupBy->
30fe0 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  nExpr);.      sq
30ff0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
31000 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
31010 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
31020 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
31030 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
31040 20 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77   "output one row
31050 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
31060 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
31070 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74  OP_IfPos, iAbort
31080 46 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20  Flag, addrEnd); 
31090 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
310a0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
310b0 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62  nt((v, "check ab
310c0 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
310d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
310e0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
310f0 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72  , regReset, addr
31100 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  Reset);.      Vd
31110 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
31120 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72  eset accumulator
31130 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  "));..      /* U
31140 70 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67  pdate the aggreg
31150 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73  ate accumulators
31160 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f   based on the co
31170 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a  ntent of.      *
31180 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  * the current ro
31190 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  w.      */.     
311a0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
311b0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
311c0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
311d0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
311e0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
311f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
31200 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
31210 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
31220 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
31230 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
31240 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
31250 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
31260 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
31270 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
31280 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
31290 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
312a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
312b0 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
312c0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
312d0 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
312e0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64  oop);.        Vd
312f0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
31300 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31310 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
31320 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
31330 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
31340 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
31350 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b  addrSortingIdx);
31360 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31370 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69  /* Output the fi
31380 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  nal row of resul
31390 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
313a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
313b0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
313c0 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
313d0 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
313e0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
313f0 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61  (v, "output fina
31400 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20  l row"));..     
31410 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68   /* Jump over th
31420 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20  e subroutines.  
31430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
31440 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
31450 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
31460 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
31470 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
31480 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
31490 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
314a0 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
314b0 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
314c0 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
314d0 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
314e0 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
314f0 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
31500 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
31510 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
31520 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
31530 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
31540 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
31550 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
31560 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
31570 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
31580 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
31590 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
315a0 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
315b0 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
315c0 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
315d0 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
315e0 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
315f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
31600 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
31610 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
31620 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
31630 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
31640 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
31650 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
31660 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
31670 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
31680 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
31690 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
316a0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
316b0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
316c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
316d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
316e0 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
316f0 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
31700 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
31710 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
31720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
31730 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
31740 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
31750 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
31760 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
31770 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65  e(v);.      Vdbe
31780 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
31790 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
317a0 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
317b0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
317c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
317d0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
317e0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
317f0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
31800 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
31810 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
31820 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
31830 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
31840 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
31850 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  w+1, SQLITE_JUMP
31860 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
31870 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
31880 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
31890 69 73 74 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  ist, -1, &sSort,
318a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
318b0 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63         &sDistinc
318c0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318e0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
318f0 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a   addrSetAbort);.
31900 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
31910 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
31920 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
31930 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
31940 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
31950 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
31960 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
31970 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
31980 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
31990 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
319a0 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
319b0 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
319c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
319d0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
319e0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
319f0 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
31a00 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
31a10 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
31a20 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
31a30 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
31a40 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20  Reset);.     .  
31a50 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
31a60 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67  oupBy.  Begin ag
31a70 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
31a80 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59  without GROUP BY
31a90 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  : */.    else {.
31aa0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
31ab0 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65  pDel = 0;.#ifnde
31ac0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
31ad0 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
31ae0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
31af0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
31b00 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
31b10 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
31b20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
31b30 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
31b40 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
31b50 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
31b60 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
31b70 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
31b80 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
31b90 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
31ba0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
31bb0 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
31bc0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
31bd0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31be0 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
31bf0 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
31c00 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
31c10 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
31c20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
31c30 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
31c40 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
31c50 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
31c60 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
31c70 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
31c80 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
31c90 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
31ca0 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
31cb0 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
31cc0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
31cd0 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
31ce0 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
31cf0 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
31d00 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
31d10 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
31d20 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
31d30 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
31d40 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
31d50 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
31d60 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
31d70 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
31d80 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
31d90 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
31da0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31db0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
31dc0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
31dd0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
31de0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
31df0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
31e00 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
31e10 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
31e20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
31e30 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
31e40 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
31e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
31e70 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
31e80 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
31e90 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31eb0 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
31ec0 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
31ed0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
31ee0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
31ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
31f00 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
31f10 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
31f20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
31f30 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
31f40 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
31f50 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
31f60 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
31f70 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
31f80 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
31f90 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
31fa0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
31fb0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
31fc0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
31fd0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
31fe0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
31ff0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
32000 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
32010 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
32020 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
32030 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
32040 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
32050 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
32060 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
32070 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
32080 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
32090 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
320a0 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69  tries in a parti
320b0 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
320c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
320d0 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
320e0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
320f0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
32100 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
32110 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
32120 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
32130 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
32140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32150 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
32160 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71  ab) ) pBest = sq
32170 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
32180 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
32190 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
321a0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
321b0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
321c0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
321d0 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
321e0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ed==0.          
321f0 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   && pIdx->szIdxR
32200 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
32210 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
32220 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
32230 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ere==0.         
32240 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20    && (!pBest || 
32250 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
32260 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a  Best->szIdxRow).
32270 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
32280 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
32290 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
322a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
322b0 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29       if( pBest )
322c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
322d0 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
322e0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
322f0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
32300 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
32310 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
32320 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
32330 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
32340 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
32350 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
32360 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
32370 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
32380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
32390 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  nt(v, OP_OpenRea
323a0 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
323b0 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  iDb, 1);.       
323c0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
323d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
323e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
323f0 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
32400 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
32410 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FO);.        }. 
32420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
32430 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
32440 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
32450 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
32460 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
32470 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
32480 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
32490 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
324a0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
324b0 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
324c0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
324d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
324e0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
324f0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
32500 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
32510 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
32520 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
32530 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
32540 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
32550 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
32560 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
32570 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
32580 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
32590 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
325a0 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
325b0 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
325c0 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
325d0 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
325e0 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
325f0 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
32600 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
32610 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
32620 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
32630 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
32640 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
32650 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
32660 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
32670 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
32680 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
32690 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
326a0 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
326b0 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
326c0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
326d0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
326e0 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
326f0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
32700 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
32710 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
32720 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
32730 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
32740 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
32750 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
32760 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
32770 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
32780 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
32790 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
327a0 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
327b0 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
327c0 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
327d0 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
327e0 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
327f0 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ior as follows:.
32800 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
32810 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
32820 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
32830 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
32840 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
32850 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
32860 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
32870 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
32880 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
32890 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
328a0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
328b0 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
328c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
328d0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
328e0 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
328f0 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
32900 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
32910 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
32920 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
32930 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
32940 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
32950 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
32960 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
32970 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
32980 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
32990 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
329a0 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
329b0 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
329c0 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
329d0 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
329e0 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
329f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
32a00 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
32a10 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
32a20 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  ag = WHERE_ORDER
32a30 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  BY_NORMAL;.     
32a40 20 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65     .        asse
32a50 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
32a60 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
32a70 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b  sert( flag==0 );
32a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
32a90 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20  pHaving==0 ){.  
32aa0 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d          flag = m
32ab0 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67  inMaxQuery(&sAgg
32ac0 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b  Info, &pMinMax);
32ad0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32ae0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
32af0 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d  =0 || (pMinMax!=
32b00 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 && pMinMax->nE
32b10 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20  xpr==1) );..    
32b20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
32b30 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
32b40 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
32b50 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d  istDup(db, pMinM
32b60 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ax, 0);.        
32b70 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
32b80 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
32b90 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
32ba0 69 6c 65 64 20 7c 7c 20 70 4d 69 6e 4d 61 78 21  iled || pMinMax!
32bb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
32bc0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
32bd0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
32be0 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
32bf0 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 66  0].sortOrder = f
32c00 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag!=WHERE_ORDER
32c10 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20  BY_MIN ?1:0;.   
32c20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
32c30 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
32c40 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
32c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32c60 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f    }.  .        /
32c70 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73  * This case runs
32c80 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74   if the aggregat
32c90 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42  e has no GROUP B
32ca0 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20  Y clause.  The. 
32cb0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
32cc0 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
32cd0 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
32ce0 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
32cf0 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  e row.        **
32d00 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20   of output..    
32d10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
32d20 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
32d30 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
32d40 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e  o);.        pWIn
32d50 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
32d60 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
32d70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
32d80 20 70 4d 69 6e 4d 61 78 2c 20 30 2c 66 6c 61 67   pMinMax, 0,flag
32d90 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
32da0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20   pWInfo==0 ){.  
32db0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
32dc0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
32dd0 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
32de0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
32df0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
32e00 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
32e10 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
32e20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
32e30 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e      assert( pMin
32e40 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61  Max==0 || pMinMa
32e50 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  x->nExpr==1 );. 
32e60 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
32e70 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
32e80 28 70 57 49 6e 66 6f 29 3e 30 20 29 7b 0a 20 20  (pWInfo)>0 ){.  
32e90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
32ea0 64 62 65 47 6f 74 6f 28 76 2c 20 73 71 6c 69 74  dbeGoto(v, sqlit
32eb0 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
32ec0 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20  l(pWInfo));.    
32ed0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
32ee0 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69  t((v, "%s() by i
32ef0 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20  ndex",.         
32f00 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48         (flag==WH
32f10 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
32f20 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
32f30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32f40 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
32f50 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20  d(pWInfo);.     
32f60 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
32f70 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
32f80 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
32f90 20 20 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74    }..      sSort
32fa0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
32fb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
32fc0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
32fd0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
32fe0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
32ff0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
33000 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
33010 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
33020 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20  , -1, 0, 0, .   
33030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33040 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
33050 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
33060 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
33070 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
33080 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
33090 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
330a0 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
330b0 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
330c0 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
330d0 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73  uery */..  if( s
330e0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
330f0 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  pe==WHERE_DISTIN
33100 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a  CT_UNORDERED ){.
33110 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
33120 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49  able(pParse, "DI
33130 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20  STINCT");.  }.. 
33140 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
33150 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
33160 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
33170 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
33180 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
33190 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
331a0 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
331b0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
331c0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b  Sort.pOrderBy ){
331d0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
331e0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 0a 20 20  Table(pParse,.  
331f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33200 20 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3e     sSort.nOBSat>
33210 30 20 3f 20 22 52 49 47 48 54 20 50 41 52 54 20  0 ? "RIGHT PART 
33220 4f 46 20 4f 52 44 45 52 20 42 59 22 3a 22 4f 52  OF ORDER BY":"OR
33230 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67 65  DER BY");.    ge
33240 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 70  nerateSortTail(p
33250 50 61 72 73 65 2c 20 70 2c 20 26 73 53 6f 72 74  Parse, p, &sSort
33260 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
33270 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
33280 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
33290 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
332a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
332b0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
332c0 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
332d0 68 65 20 53 45 4c 45 43 54 20 68 61 73 20 62 65  he SELECT has be
332e0 65 6e 20 63 6f 64 65 64 2e 20 49 66 20 74 68 65  en coded. If the
332f0 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  re is an error i
33300 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72 75  n the Parse stru
33310 63 74 75 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20  cture,.  ** set 
33320 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
33330 74 6f 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20  to 1. Otherwise 
33340 30 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50  0. */.  rc = (pP
33350 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a  arse->nErr>0);..
33360 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
33370 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
33380 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
33390 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
333a0 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
333b0 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
333c0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
333d0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
333e0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
333f0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
33400 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
33410 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
33420 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
33430 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
33440 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
33450 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
33460 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
33470 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
33480 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
33490 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
334a0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
334b0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
334c0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
334d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
334e0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
334f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
33500 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
33510 75 6e 63 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  unc);.#if SELECT
33520 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
33530 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
33540 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 70 72 6f  arse,p,("end pro
33550 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
33560 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 49  pParse->nSelectI
33570 6e 64 65 6e 74 2d 2d 3b 0a 23 65 6e 64 69 66 0a  ndent--;.#endif.
33580 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a       return rc;.}.